2013-07-22 193 views
25

這可能是一個容易回答的問題,但我無法得到這個簡單的程序工作,這讓我發瘋。我有這樣一段代碼:爲什麼我的函數返回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() 

現在,如果我只是輸入「A」或「B」,一切都很好。輸出是:

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

但是,如果我輸入別的東西,然後「一」或「b」,我得到這個:

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

我不知道爲什麼Dat_Function()正在恢復None,因爲它應該只返回my_var。打印語句顯示my_var是正確的值,但該函數由於某種原因未返回該值。

+6

遞歸調用時需要'返回Dat_Function()'。 –

+2

只是提示:'my_var!=「a」和my_var!=「b」'條件的慣用方式是'my_var不在('a','b')' – gonz

回答

42

它返回None,因爲當你遞歸調用它:

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

..你沒有返回值。

因此,當遞歸確實發生時,返回值會被丟棄,然後您會從函數的末尾落下。脫落功能的結束,這意味着Python隱含返回None,就像這樣:

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

所以,而不只是if聲明,呼籲Dat Function(),你需要return它。

+0

不應該通過如果聲明再次如果它被遞歸調用?我不明白爲什麼它不會返回一個值。 – Cate

+0

不是。看我的編輯。發生遞歸,然後丟棄遞歸返回的內容。 – roippi

+0

所以如果你從同一個函數內調用一個函數,那麼返回值會被丟棄,但是你在那個函數中返回相同的函數,你真的只需要在main()中調用它呢? – Cate

4

要返回非None值,您需要使用return語句。

在你的情況下,if塊只在執行一個分支時執行返回。將返回移到if/else塊之外,或者在兩個選項中都有返回值。

+0

我試過將它移出塊,但無濟於事。它不是返回正確的值,而是返回第一個不正確的值。另外,我不想爲if/else語句的if部分返回聲明,因爲我希望函數只返回正確的值。 – 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

我認爲你應該使用while循環。 !

如果my_var = 「a」 和my_var = 「B」: 打印 「您沒有輸入\」 A \ 「或\ 」B \「 請再試一次。」 打印「」 回報Dat_Function()

考慮您輸入的東西不同於「A」和「B」,當然,它會調用Dat_Function但隨後被跳過的一個部分。那就是:

其他: 打印my_var 「 - 從Dat_Function」 回報my_var

,並直接進入:

高清的main(): 打印Dat_Function( ) 「 - 從主()」

所以,如果你使用while循環:

而my_var = 「a」 和my_var = 「B」:! 打印( '你沒有A型或B') 回報Dat_Function()

這種方式,我認爲你可以處理它。