2013-07-22 196 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()

这种方式,我认为你可以处理它。