2011-04-19 41 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

相關問題