在Python中使用另一个函数的变量
你好,这里有一个非常基础的概念。我查了一下,发现全局变量对我来说不太管用。我需要在一个叫做 judgment
的函数里使用一个在 main
函数里的变量 score
,这样我就可以根据这个分数告诉用户他们的表现如何(这也是我在 main
函数最后调用 judgment
函数的原因)。但是在 judgment
函数里出现了错误,提示说 score
这个名字没有定义。
代码:
# Trivia Challenge
# Trivia game that reads a plain text file
import sys
def open_file(file_name, mode):
"""Open a file."""
try:
the_file = open(file_name, mode)
except IOError as e:
print("Unable to open the file", file_name, "Ending program.\n", e)
input("\n\nPress the enter key to exit.")
sys.exit()
else:
return the_file
def next_line(the_file):
"""Return next line from the trivia file, formatted."""
line = the_file.readline()
line = line.replace("/", "\n")
return line
def next_block(the_file):
"""Return the next block of data from the trivia file."""
category = next_line(the_file)
question = next_line(the_file)
answers = []
for i in range(4):
answers.append(next_line(the_file))
correct = next_line(the_file)
if correct:
correct = correct[0]
explanation = next_line(the_file)
point = next_line(the_file)
return category, question, answers, correct, explanation, point
def welcome(title):
"""Welcome the player and get his/her name."""
print("\t\tWelcome to Trivia Challenge!\n")
print("\t\t", title, "\n")
def judgement(score):
if score > 0 and score <= 5:
print("You can do better.")
elif score >= 6 and score <= 10:
print("You did okay.")
elif score >= 11 and score <= 14:
print("You did average.")
elif score >= 15 and score <= 19:
print("You did above average.")
elif score >= 20 and score <= 24:
print("You did excellent.")
else:
print("Does not exist.")
def main():
trivia_file = open_file("trivia_points.txt", "r")
title = next_line(trivia_file)
welcome(title)
score = 0
# get first block
category, question, answers, correct, explanation, point = next_block(trivia_file)
while category:
# ask a question
print(category)
print(question)
for i in range(4):
print("\t", i + 1, "-", answers[i])
# get answer
answer = input("What's your answer?: ")
# check answer
if answer == correct:
print("\nRight!", end=" ")
score += int(point)
else:
print("\nWrong.", end=" ")
print(explanation)
print("Score:", score, "\n\n")
# get next block
category, question, answers, correct, explanation, point = next_block(trivia_file)
trivia_file.close()
print("That was the last question!")
print("You're final score is", score)
judgement(score)
main()
input("\n\nPress the enter key to exit.")
trivia_points.txt 文件的内容:
An Episode You Can't Refuse
Tooth hurts?
Let's say your tooth hurts real bad. Where would you go?
Dentist
Butler
Optical
Pawn Shop
1
Because a dentist deals with teeth
2
Food for pets
Let's say you need to get your sea monster some food. Where is the best place to go?
Kroger
Pet's mart
Walmart
Target
2
Because you can find food for most pets at pets mart.
2
Get in Shape
If you want to play tennis, where would you go?
Tennis Court
Basketball Court
Beach
Football field
1
Because you can play tennis on a tennis court.
3
Loving Animals
What would you do if you came home to find your dog cooking dinner?
Beat the crap out of it
Let it destroy everything in the kitchen
Sell it
Enjoy the dinner with him
4
Because dogs are human friends and we need to care for them.
1
Feel like hunting
If you want to go fishing, what would you take with you?
Basketball
Tennis Ball
Soccer ball
Fishing Rod
4
A fishing rod might be able to help you catch some fish
2
Feeling Smart?
What is the best way to prepare for a jeopardy?
Eat a lot
Sleep a lot
Study a lot
Drink a lot
3
Because studying will help you win the game, obviously
2
Road trip
If you drove with 43 people from chicago to mississippi and picked two from texas, what is name of driver?
Jack
Bill
John
You
4
You, because you were the one who drove those people
5
Sickness relieve
If doctor gave you 3 pills to take every .5 hours, how long until all of them are taken?
.5 hours
1 hour
2 hours
1.5 hours
2
1 hour, because you could take one right away to start with
4
Need for Speed
If I have to travel 4 miles on I-35 in traffic, what would I take?
The bus
The car
The speed bike
By foot
3
The speed bike because it could cut through traffic, even thoguh you could get a ticket
2
Time for Party
What would not be a smart move in a crowded bar or party?
Pay for your own drink
Don't get in a fight
Make sure you bring your friend along
Take drinks from everyone
4
Taking drinks from everyone wouldn't be smart, because that could be dangerous
1
2 个回答
2
看起来你是在 main()
之前就调用了 judgement(score)
(这两个都在脚本的底部)。为什么不把 judgement(score)
移到 main
里面呢?这样的话,main
里的 score
就会被复制到 judgement
的本地环境中,这样就不需要用到全局变量了。
3
你在main()
函数的范围外调用了judgement(score)
。这里的score
变量只在这个函数内部有效。只需要把那一行代码缩进到和函数的其他部分对齐就可以了。
在Python中,缩进是有语法意义的,所以你并不是在“在main的最底部调用judgment函数”,而是在main函数调用之前就调用了它。