2016-05-29 10 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

、ここにある:


ここで(始めとして定義された最初の部分)を考えます数は、と尋ねる次の部分を尋ねるように定義されることが

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() 

1〜10の数を考えているユーザーに伝えます()と推測する数字を入力するようにユーザーに依頼します。十分な推測が残っている限りです。

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機能を呼び出す:begin内、askへの呼び出しがあったが、この時点でask機能がまだないこと

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! 

お知らせまだ存在する!

beginaskplayAgainには、スクリプトの最後に少なくとも電話をかけたいと思うかもしれません。このような何か:今

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

begin() 
ask() 
playAgain() 

は、この変更を行っても、あなたのプログラムは、あなたがやっていると思う何をしていません。いくつかの問題があります。

  • あなたは彼らが暗黙的playAgainによって呼び出されているため、実際に、beginまたはaskを呼び出す必要はありません。
  • 変数guessesRemainingrandomNumberはともにローカルです。したがって、別の関数を呼び出すと、同じ変数がまったく表示されません。この問題を解決するには、変数グローバルを行うことができます。askため

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

    と同様。あなたの例では

0

、あなたask()begin()を呼び出すには、定義されているので、beginはそれを呼び出そうとした場合、それは未定義です。

通常は、すべての関数を呼び出す前にすべての関数を定義する必要があります。それ以外の場合は、すべての機能が利用可能になる前にプログラムの実行を開始します。あなたの呼び出しをファイルの一番下に移動すれば、呼び出されるときにすべてが定義されます。

関連する問題