2016-05-29 13 views
0

Ich erstelle ein Spiel "Raten Sie die Zahl" und habe Probleme, wenn ich versuche, es auszuführen. Der Fehler I erhalten wie folgt:NameError bei Verwendung der Def-Funktion in Python

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

In den verschiedenen ‚Brocken‘ ich das Skript definiert haben, in, hier ist sie:


Der erste Teil hier definiert als begin() denkt an eine Zahl, und fragt, wird dem Benutzer mitgeteilt, dass es zwischen 1 und 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() 

der nächste Teil ist definiert als eine Reihe denken fragen() und fordert den Benutzer auf, eine Zahl einzugeben, die er erraten hat, solange noch genug Vermutungen vorliegen.

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

Und dieser letzte Teil wird als playAgain() definiert, die den Benutzer fragt, ob sie wieder spielen wollen.

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

Antwort

0

Sie müssen ask() definieren, bevor es nennen, wie man mit begin() tat. Python ist eine interpretierte Sprache. Wenn also eine Funktion über ihrer Definition aufgerufen wird, erkennt der Interpreter sie nicht.

3

Sie können ask nicht anrufen, bis ask definiert wurde.

Hier rufen Sie die begin Funktion sofort nachdem es definiert wurde:

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! 

Beachten Sie, dass innerhalb begin, ein Anruf zu ask ist, aber von diesem Punkt ist die ask Funktion immer noch nicht noch existieren!

Sie möchten wahrscheinlich die Anrufe auf begin, ask und den ganzen Weg am Ende des Skripts mindestens setzen. So etwas wie das:

Jetzt, auch mit dieser Änderung, tut Ihr Programm nicht, was Sie denken, tut. Es gibt mehrere Probleme:

  • Sie brauchen nicht begin oder ask zu nennen, eigentlich, weil sie implizit durch playAgain genannt werden.
  • Die Variable guessesRemaining und randomNumber sind beide lokale auf die Funktion, also immer dann, wenn Sie eine andere Funktion aufrufen, werden sie überhaupt nicht sehen, die gleiche Variable sehen. Um dies zu beheben können Sie die Variablen machen global:

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

    Und in ähnlicher Weise für ask.

0

In Ihrem Beispiel, rufen Sie begin() vor ask() definiert wurde, so dass, wenn begin versucht es zu nennen, es ist nicht definiert.

Normalerweise möchten Sie alle Ihre Funktionen definieren, bevor Sie eine davon aufrufen. Andernfalls beginnen Sie mit der Ausführung Ihres Programms, bevor alle Ihre Funktionen verfügbar sind. Bewegen Sie einfach Ihren Anruf an den unteren Rand Ihrer Datei und alles wird definiert, wenn es angerufen wird.