2016-05-29 68 views
0

我正在創建一個'猜數字'遊戲,並且在嘗試運行它時遇到問題。我得到的錯誤是如下:在Python中使用def函數時出現NameError

Traceback (most recent call last):
File "C:\Users\Troy\Desktop\guess.py", line 10, in
begin()
File "C:\Users\Troy\Desktop\guess.py", line 9, in begin
ask()
NameError: name 'ask' is not defined

在不同的「塊」我已經在定義腳本,那就是:


)這裏被定義爲開始(第一部分認爲的一個數字,並詢問告訴它被1和10

def begin(): 
    import random 
    import sys 
    guessesRemaining = 3 
    randomNumber = random.randint(1,10) 
    print("I am thinking of a number between 1 and 10.") 
    ask() 
begin() 

思維之間的數的下一部分被定義爲詢問用戶(),並要求用戶輸入他們猜測的數字,只要他們有足夠的猜測。

def ask(): 
    if guessesRemaining == 0: 
     print("Oh no! You've run out of guesses! I was thinking of the number " + str(randomNumber) + ".") 
    else: 
     print ("Take a guess.") 
     guess = input(">> ") 
     if int(guess) < randomNumber: 
      print("Your number is too small!") 
      global guessesRemaining 
      guessesRemaining -= int(1) 
      ask() 
     elif int(guess) > randomNumber: 
      print("Your number is too big!") 
      global guessesRemaining 
      guessesRemaining -= int(1) 
      ask() 
     elif int(guess) == randomNumber: 
      print("Well done! You got the right number!") 
      playAgain() 
ask() 

這最後一部分被定義爲playAgain(),它會詢問用戶是否要再次播放。

def playAgain(): 
    print("Would you like to play again?") 
    again = input 
    if again == y or Y or yes or Yes: 
     print("Restarting game...") 
     begin() 
    if again == n or N or no or No: 
     print("Quitting game...") 
     sys.quit() 
    else: 
     print("Invalid response!") 
     playAgain() 
playAgain() 

回答

0

你需要調用它,就像你與begin()做之前定義ask()。 Python是一種解釋型語言,所以如果一個函數在其定義之上被調用,解釋器將無法識別它。

3

您不能撥打ask,直到ask已被定義。

在這裏,你馬上調用begin功能它已被定義後:

def begin(): 
    import random 
    import sys 
    guessesRemaining = 3 
    randomNumber = random.randint(1,10) 
    print("I am thinking of a number between 1 and 10.") 
    ask() 
begin() # this calls begin immediately! 

注意內begin,還有就是ask打電話,但此時ask功能仍然不還存在!

您可能想要至少在腳本的最後將所有呼叫置於beginaskplayAgain之間。就像這樣:

def begin(): 
    ... 
def ask(): 
    ... 
def playAgain(): 
    ... 

begin() 
ask() 
playAgain() 

現在,即使有了這個改變,你的程序也沒有按照你的想法去做。有幾個問題:

  • 你並不需要調用beginask,實際上,因爲他們是隱式playAgain調用。
  • 變量guessesRemainingrandomNumber都是本地該函數,因此無論何時調用另一個函數,他們都看不到相同的變量。爲了解決這個問題,你可以使變量全球

    def begin(): 
        global guessesRemaining, randomNumber 
        ... 
    

    ,類似的還有ask

0

在你的榜樣,你叫begin()ask()之前已經被定義,所以當begin嘗試調用它,它是不確定的。

您通常希望在調用其中的任何函數之前定義所有函數。否則,您將在所有功能可用之前開始執行程序。只需將您的調用移至文件的底部,並在調用時定義所有內容。