2013-07-22 15 views
25

Das mag eine einfache Frage zu beantworten sein, aber ich kann dieses einfache Programm nicht funktionieren und es macht mich verrückt. Ich habe dieses Stück Code:Warum gibt meine Funktion None zurück?

def Dat_Function(): 
    my_var = raw_input("Type \"a\" or \"b\": ") 

    if my_var != "a" and my_var != "b": 
     print "You didn't type \"a\" or \"b\". Try again." 
     print " " 
     Dat_Function() 
    else: 
     print my_var, "-from Dat_Function" 
     return my_var 


def main(): 
    print Dat_Function(), "-From main()" 

main() 

Nun, wenn ich nur Eingang „a“ oder „b“, alles in Ordnung ist. Die Ausgabe lautet:

Type "a" or "b": a 
a -from Dat_Function 
a -From main() 

Aber, wenn ich etwas anderes und dann "a" oder "b" eingeben, bekomme ich diese:

Type "a" or "b": purple 
You didn't type "a" or "b". Try again. 

Type "a" or "b": a 
a -from Dat_Function 
None -From main() 

Ich weiß nicht, warum Dat_Function() ist None Rückkehr da es nur my_var zurückgeben sollte. Die print-Anweisung zeigt an, dass my_var der richtige Wert ist, aber die Funktion gibt diesen Wert aus irgendeinem Grund nicht zurück.

+6

Sie müssen 'Dat_Function()' zurückgeben, wenn Sie es rekursiv aufrufen. –

+2

Nur ein Tipp: Der idiomatische Weg dieser 'my_var! =" A "und my_var! =" B "' Bedingung wäre 'my_var nicht in ('a', 'b')' – gonz

Antwort

42

Es kehrt None, denn wenn man es rekursiv rufen:

if my_var != "a" and my_var != "b": 
    print "You didn't type \"a\" or \"b\". Try again." 
    print " " 
    Dat_Function() 

..you Sie den Wert nicht zurück.

Also, während die Rekursion passiert, wird der Rückgabewert verworfen, und dann fallen Sie vom Ende der Funktion. Fallen das Ende der Funktion off bedeutet, dass Python None implizit zurückgibt, wie folgt aus:

>>> def f(x): 
...  pass 
>>> print(f(20)) 
None 

Also, statt nur AufrufDat Function() in Ihrer if Anweisung, müssen Sie es return.

+0

Sollte es nicht durch die laufen if-Anweisung wieder, wenn es rekursiv aufgerufen wird? Ich verstehe nicht, warum es keinen Wert zurückgeben würde. – Cate

+0

Nein. Siehe meine Bearbeitung. Die Rekursion passiert und Sie verwerfen, was die Rekursion zurückgibt. – roippi

+0

Wenn Sie also eine Funktion innerhalb derselben Funktion aufrufen, wird der Rückgabewert verworfen, aber Sie geben dieselbe Funktion in der Funktion zurück, die Sie wirklich nur in 'main()' aufrufen. – Cate

4

Um einen anderen Wert als None zurückzugeben, müssen Sie eine return-Anweisung verwenden.

In Ihrem Fall führt der if-Block nur eine Rückgabe aus, wenn eine Verzweigung ausgeführt wird. Verschieben Sie die Rückgabe entweder außerhalb des if/else-Blocks oder in beiden Optionen.

+0

Ich habe versucht, es aus dem Block zu bewegen, aber ohne Erfolg. Anstatt den richtigen Wert zurückzugeben, wird der erste falsche Wert zurückgegeben. Außerdem möchte ich keine return-Anweisung für den if-Teil der if/else-Anweisung, da die Funktion nur einen korrekten Wert zurückgeben soll. – Cate

4
def Dat_Function(): 
    my_var = raw_input("Type \"a\" or \"b\": ") 

    if my_var != "a" and my_var != "b": 
     print "You didn't type \"a\" or \"b\". Try again." 
     print " " 
     return Dat_Function() 
    else: 
     print my_var, "-from Dat_Function" 
     return my_var 


def main(): 
    print Dat_Function(), "-From main()" 

main() 
0

Ich denke, dass Sie während Schleifen verwenden sollten. !

wenn my_var = "a" und my_var = "b": ". Versuchen Sie es erneut " print "Sie haben es nicht geben \" A \" oder \" b \ print „“ return Dat_Function()

Bedenken Sie, dass Sie etwas anderes als Typ „a“ und „b“, natürlich wird es Dat_Function nennen, aber dann wird es den nächsten Teil zu überspringen.Das ist:

anderes: Druck my_var "-von Dat_Function" return my_var

Und wird direkt in gehen:

def main(): Druck Dat_Function (), "-Front main()"

Also, wenn Sie While-Schleife verwenden als:

während my_var = "a" und my_var = "b":! Druck return Dat_Function() ('Sie haben keine oder B-Typen')

Auf diese Weise Ich denke, dass du damit umgehen kannst.

Verwandte Themen