为什么我的函数返回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() 

但是,如果我输入其他内容,然后输入“a”或“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 。 print语句显示my_var是正确的值,但是由于某种原因,函数不会返回该值。

它返回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它。

要返回一个非None的值,你需要使用一个return语句。

在你的情况下,if块只在执行一个分支时执行返回。 要么移动if / else块外的返回值,要么在两个选项中都有返回值。

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