2013-07-22 16 views
25

Questa potrebbe essere una domanda facile a cui rispondere, ma non riesco a far funzionare questo semplice programma e mi sta facendo impazzire. Ho questo codice:Perché la mia funzione restituisce None?

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

Ora, se inserisco solo "a" o "b", tutto va bene. L'output è:

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

Ma, se digito qualcosa di diverso e quindi "a" o "b", ottengo questo:

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

non so il motivo per cui Dat_Function() sta tornando None, dal momento che dovrebbe restituire solo my_var. L'istruzione print mostra che my_var è il valore corretto, ma la funzione non restituisce quel valore per qualche motivo.

+6

È necessario eseguire 'return Dat_Function()' quando lo si chiama in modo ricorsivo. –

+2

Solo un suggerimento: il modo idiomatico di quella condizione 'my_var! =" A "e my_var! =" B "' sarebbe 'my_var non in ('a', 'b')' – gonz

risposta

42

Si sta tornando None perché quando si chiama in modo ricorsivo:

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

..si non restituiscono il valore.

Così mentre si verifica la ricorsione, il valore di ritorno viene scartato e quindi si interrompe la fine della funzione. Cadere la fine della funzione significa che Python ritorna implicitamente None, proprio come questo:

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

Così, invece di chiamare Dat Function() nel vostro if dichiarazione, è necessario return esso.

+0

Non dovrebbe attraversare il se la dichiarazione di nuovo se è chiamato in modo ricorsivo? Non capisco perché non restituirebbe un valore. – Cate

+0

No. Vedi la mia modifica. La ricorsione accade, e poi scarti ciò che ritorna la ricorsione. – roippi

+0

Quindi, se si richiama una funzione dall'interno di quella stessa funzione, il valore di ritorno viene scartato, ma si restituisce la stessa funzione in quella funzione che si chiama semplicemente in 'main()'? – Cate

4

Per restituire un valore diverso da Nessuno, è necessario utilizzare un'istruzione di reso.

Nel proprio caso, il blocco if esegue un ritorno solo quando si esegue un ramo. O spostare il rendimento al di fuori del blocco if/else o avere ritorni in entrambe le opzioni.

+0

Ho provato a spostarlo dal blocco, ma senza successo. Invece di restituire il valore corretto, restituisce il primo valore errato. Inoltre, non voglio un'istruzione return per la parte if dell'istruzione if/else perché voglio che la funzione restituisca solo un valore corretto. – 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

Penso che si dovrebbe usare cicli while. !

se my_var = "a" e my_var = "b":! print "Lei non ha il tipo \" a \ "o \ "B \". Prova di nuovo." stampa "" ritorno Dat_Function()

Si consideri che si digita qualcosa di diverso da "a" e "b", naturalmente, chiamerà Dat_Function ma allora è saltare la prossima parte.Che è:

altro: stampa my_var, "-da Dat_Function" ritorno my_var

E andrà direttamente in:

def main(): Dat_Function stampa (), "-Da principale()"

Quindi, se si utilizza il ciclo come:

mentre my_var = "a" e my_var = "b":!! di stampa ('non hai tipo A o B') ritorno Dat_Function()

In questo modo credo che puoi gestirlo

Problemi correlati