考虑以下三个功能:
def my_func1(): print "Hello World" return None def my_func2(): print "Hello World" return def my_func3(): print "Hello World"
它们似乎都返回None。这些函数的返回值之间的行为有什么不同吗?有什么理由让你更喜欢其中一个而不是另一个吗?
None
另见:是否可能不从python中的函数返回任何东西?< / >
它们各自返回相同的单例None——没有功能上的区别。
我认为省略return语句是合理的习惯,除非您需要它在早期跳出函数(在这种情况下更常见的是一个裸的return),或者返回None以外的内容。当函数中有另一个路径返回None以外的值时,写return None也是有意义的,而且似乎是习惯用法。显式地写出return None是一个视觉提示,告诉读者还有另一个分支返回更有趣的东西(并且调用代码可能需要处理这两种类型的返回值)。
return
return None
通常在Python中,返回None的函数就像C中的void函数一样使用——它们的目的通常是对输入参数在适当的位置进行操作(除非你使用全局数据(颤栗))。返回None通常更明确地表明参数发生了变化。这就更清楚地说明了为什么从“语言约定”的立场上去掉return语句是有意义的。
void
也就是说,如果你在一个代码库中工作,这个代码库已经有了关于这些事情的预先设置的约定,我肯定会遵循这个规则来帮助代码库保持统一……
在实际行为上,没有区别。它们都返回None,就是这样。然而,所有这些都是有时间和地点的。 下面的说明基本上是不同的方法应该如何使用(或者至少是我被教导应该如何使用),但它们不是绝对的规则,所以如果你觉得有必要,你可以把它们混合起来
这表明该函数确实要返回一个值供以后使用,在本例中它返回None。这个值None可以在其他地方使用。如果函数没有其他可能的返回值,则永远不会使用return None。
在下面的例子中,如果给出的person是一个人,则返回person的mother。如果它不是人类,我们返回None,因为person没有mother(让我们假设它不是动物或其他东西)。
person
mother
def get_mother(person): if is_human(person): return person.mother else: return None
使用它的原因与循环中的break相同。返回值不重要,你只想退出整个函数。它在某些地方非常有用,即使你不经常需要它。
break
我们发现了15个prisoners,我们知道其中一人有刀。我们逐个循环检查每个prisoner,以检查他们是否有刀。如果我们用刀击中这个人,我们可以退出函数,因为我们知道只有一把刀,没有理由检查prisoners的其余部分。如果我们没有找到带刀的prisoner,我们就会发出警报。这可以通过许多不同的方式实现,使用return可能甚至不是最好的方式,但这只是一个示例,展示如何使用return退出函数。
prisoners
prisoner
def find_prisoner_with_knife(prisoners): for prisoner in prisoners: if "knife" in prisoner.items: prisoner.move_to_inquisition() return # no need to check rest of the prisoners nor raise an alert raise_alert()
注意:永远不要执行var = find_prisoner_with_knife(),因为返回值不是用来捕获的。
var = find_prisoner_with_knife()
这也将返回None,但该值并不用于使用或捕获。它仅仅意味着函数成功结束。它基本上与c++或Java等语言中的void函数中的return相同。
在下面的例子中,我们设置了一个人的母亲的名字,然后函数成功完成后退出。
def set_mother(person, mother): if is_human(person): person.mother = mother
注意:永远不要执行var = set_mother(my_person, my_mother),因为返回值不是用来捕获的。
var = set_mother(my_person, my_mother)
是的,它们都一样。
我们可以检查已解释的机器码,以确认它们都在做完全相同的事情。
import dis def f1(): print "Hello World" return None def f2(): print "Hello World" return def f3(): print "Hello World" dis.dis(f1) 4 0 LOAD_CONST 1 ('Hello World') 3 PRINT_ITEM 4 PRINT_NEWLINE 5 5 LOAD_CONST 0 (None) 8 RETURN_VALUE dis.dis(f2) 9 0 LOAD_CONST 1 ('Hello World') 3 PRINT_ITEM 4 PRINT_NEWLINE 10 5 LOAD_CONST 0 (None) 8 RETURN_VALUE dis.dis(f3) 14 0 LOAD_CONST 1 ('Hello World') 3 PRINT_ITEM 4 PRINT_NEWLINE 5 LOAD_CONST 0 (None) 8 RETURN_VALUE
就功能而言,它们都是相同的,它们之间的区别在于代码可读性和风格(这是需要考虑的重要因素)
正如其他人回答的那样,结果完全相同,在所有情况下都返回None。
区别是风格上的,但请注意,< >强PEP8 < / >强要求使用一致:
return语句一致。中的所有返回语句 函数应该返回一个表达式,或者它们都不应该返回。如果有任何 返回语句返回一个表达式,任何返回语句,其中没有 返回的值应该显式地将其声明为return None 显式的return语句应该出现在函数的末尾 (如果可以)。< / p > 是的: def foo(x): if x >= 0: return math.sqrt(x) else: return None def bar(x): if x < 0: return None return math.sqrt(x) 没有: def foo(x): if x >= 0: return math.sqrt(x) def bar(x): if x < 0: return return math.sqrt(x)
return语句一致。中的所有返回语句 函数应该返回一个表达式,或者它们都不应该返回。如果有任何 返回语句返回一个表达式,任何返回语句,其中没有 返回的值应该显式地将其声明为return None 显式的return语句应该出现在函数的末尾 (如果可以)。< / p >
是的:
def foo(x): if x >= 0: return math.sqrt(x) else: return None def bar(x): if x < 0: return None return math.sqrt(x)
没有:
def foo(x): if x >= 0: return math.sqrt(x) def bar(x): if x < 0: return return math.sqrt(x)
https://www.python.org/dev/peps/pep-0008/#programming-recommendations
基本上,如果你在函数中返回非None的值,这意味着返回值是有意义的,并且会被调用者捕获。所以当你返回None时,它也必须是显式的,以传达None在这种情况下有意义,它是可能的返回值之一。
如果你根本不需要返回,你的函数基本上是一个过程,而不是一个函数,所以不要包括return语句。
如果你正在编写一个类似于过程的函数,并且有机会提前返回(即你已经在那里完成了,不需要执行函数的剩余部分),你可以使用空的returns来告诉读者这只是一个执行的早期结束,隐式返回的None值没有任何意义,也不意味着被捕获(类似于过程的函数总是返回None)。