2013-07-22 30 views
25

To może być łatwe pytanie, ale nie mogę uruchomić tego prostego programu i doprowadza mnie to do szału. Mam ten fragment kodu:Dlaczego moja funkcja zwraca Brak?

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

Teraz, jeśli wprowadzę tylko "a" lub "b", wszystko jest w porządku. Wyjście jest:

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

Ale jeśli wpisuję coś innego, a następnie "A" lub "B", mam to:

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

nie wiem dlaczego Dat_Function() wraca None, ponieważ powinien zwracać tylko my_var. Instrukcja print pokazuje, że my_var jest poprawną wartością, ale funkcja nie zwraca tej wartości z jakiegoś powodu.

+6

Powinieneś zrobić 'return Dat_Function()' podczas wywoływania go rekursywnie. –

+2

Tylko wskazówka: idiomatyczny sposób tego warunku 'my_var! =" A "i my_var! =" B "' byłby następujący: my_var nie jest ("a", "b") ' – gonz

Odpowiedz

42

Jest powrocie None bo kiedy rekurencyjnie nazwać:

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

..you nie zwracają wartość.

Podczas gdy rekursja się zdarza, zwracana wartość zostaje odrzucona, a następnie spada z końca funkcji. Spadając do końca funkcji oznacza, że ​​pyton niejawnie zwraca None, podobnie jak to:

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

Tak więc, zamiast po prostu nazywającDat Function() w wyciągu if, trzeba go return.

+0

Nie powinien być uruchamiany przez jeśli instrukcja ponownie, jeśli jest nazywana rekursywnie? Nie rozumiem, dlaczego nie zwróci wartości. – Cate

+0

Nie. Zobacz moją edycję. Rekurencja ma miejsce, a następnie odrzucasz to, co powraca rekursja. – roippi

+0

Więc jeśli wywołasz funkcję z wnętrza tej samej funkcji, zwracana wartość zostanie odrzucona, ale zwrócisz tę samą funkcję w tej funkcji, którą tak naprawdę nazwałeś w 'main()'? – Cate

4

Aby zwrócić wartość inną niż None, należy użyć instrukcji return.

W twoim przypadku blok if wykonuje zwrot tylko podczas wykonywania jednego oddziału. Albo przenieś zwrot poza blok if/else, albo zwróć w obu opcjach.

+0

Próbowałem wyprowadzić go z bloku, ale bezskutecznie. Zamiast zwracania poprawnej wartości zwraca pierwszą niepoprawną wartość. Ponadto nie chcę instrukcji return dla części if instrukcji else, ponieważ chcę, aby funkcja zwracała tylko poprawną wartość. – 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

myślę, że należy użyć natomiast pętle. !

jeśli my_var = "a" i my_var = "b": ". Spróbuj ponownie " print "Nie wpisać \" a \" i \" B \ print „” powrót Dat_Function()

Uważają, że wpiszesz coś innego niż „A” i „B”, oczywiście, będzie to nazwać Dat_Function ale to jest omijając kolejną część.Który jest:

else: print my_var "-z Dat_Function" powrót my_var

i przejść bezpośrednio do:

def main(): druku Dat_Function (), "-Z głównej()"

Tak więc, jeśli używasz pętli while jako:

podczas my_var = "a" i my_var = "b":! print ('nie wpisano a lub b') Dat_Function return()

ten sposób myślę że możesz sobie z tym poradzić.

Powiązane problemy