2011-04-19 96 views
0

嘿,这是一个非常基本的概念,我查了一下,全局变量对我来说不起作用。我需要使用函数main中的变量score在另一个函数judgment中,所以根据琐事的分数,我可以告诉用户他们是怎么做的(这就是为什么我在最底层调用judgment函数的原因main)。它给出的错误名称score未在函数中定义。使用来自其他函数的变量python

代码:

# 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

不要使用像pastebin这样的外部服务来引用代码。这是信息不稳定,很快就会消失。不适合SO。 – 2011-04-19 08:23:10

回答

3

要调用judgement(score)你的main()功能的范围。该函数中的score变量是本地的。只需将该行缩进以匹配函数缩进。

在Python中,缩进具有语法意义,因此您不是“在main的最底部调用判断函数”,而是在主函数调用之前。

2

看起来你在main()之前调用judgement(score)(都在脚本的底部)。为什么不将judgement(score)转换为main?然后main的本地副本score将被复制到本地环境judgement,并且不需要全局变量。

+0

感谢您的输入。它确实有效。通过将判断(分数)转换为主数据,你的意思是复制内容或者在主函数中重新创建整个函数(所以函数在另一个函数中)。不知道你可以做到这一点 – Burton 2011-04-19 12:34:26

+0

我的意思是移动调用(通过缩小它,如@Fenikso所说),保持函数定义在哪里。很高兴工作! – 2011-04-19 19:56:47

相关问题