return, return None,还是没有return ?

考虑以下三个功能:

def my_func1():
print "Hello World"
return None


def my_func2():
print "Hello World"
return


def my_func3():
print "Hello World"

它们似乎都返回None。这些函数的返回值之间的行为有什么不同吗?有什么理由让你更喜欢其中一个而不是另一个吗?


另见:是否可能不从python中的函数返回任何东西?< / >

467027 次浏览

它们各自返回相同的单例None——没有功能上的区别。

我认为省略return语句是合理的习惯,除非您需要它在早期跳出函数(在这种情况下更常见的是一个裸的return),或者返回None以外的内容。当函数中有另一个路径返回None以外的值时,写return None也是有意义的,而且似乎是习惯用法。显式地写出return None是一个视觉提示,告诉读者还有另一个分支返回更有趣的东西(并且调用代码可能需要处理这两种类型的返回值)。

通常在Python中,返回None的函数就像C中的void函数一样使用——它们的目的通常是对输入参数在适当的位置进行操作(除非你使用全局数据(颤栗))。返回None通常更明确地表明参数发生了变化。这就更清楚地说明了为什么从“语言约定”的立场上去掉return语句是有意义的。

也就是说,如果你在一个代码库中工作,这个代码库已经有了关于这些事情的预先设置的约定,我肯定会遵循这个规则来帮助代码库保持统一……

在实际行为上,没有区别。它们都返回None,就是这样。然而,所有这些都是有时间和地点的。 下面的说明基本上是不同的方法应该如何使用(或者至少是我被教导应该如何使用),但它们不是绝对的规则,所以如果你觉得有必要,你可以把它们混合起来

使用return None

这表明该函数确实要返回一个值供以后使用,在本例中它返回None。这个值None可以在其他地方使用。如果函数没有其他可能的返回值,则永远不会使用return None

在下面的例子中,如果给出的person是一个人,则返回personmother。如果它不是人类,我们返回None,因为person没有mother(让我们假设它不是动物或其他东西)。

def get_mother(person):
if is_human(person):
return person.mother
else:
return None

使用return

使用它的原因与循环中的break相同。返回值不重要,你只想退出整个函数。它在某些地方非常有用,即使你不经常需要它。

我们发现了15个prisoners,我们知道其中一人有刀。我们逐个循环检查每个prisoner,以检查他们是否有刀。如果我们用刀击中这个人,我们可以退出函数,因为我们知道只有一把刀,没有理由检查prisoners的其余部分。如果我们没有找到带刀的prisoner,我们就会发出警报。这可以通过许多不同的方式实现,使用return可能甚至不是最好的方式,但这只是一个示例,展示如何使用return退出函数。

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(),因为返回值不是用来捕获的。

完全不使用return

这也将返回None,但该值并不用于使用或捕获。它仅仅意味着函数成功结束。它基本上与c++或Java等语言中的void函数中的return相同。

在下面的例子中,我们设置了一个人的母亲的名字,然后函数成功完成后退出。

def set_mother(person, mother):
if is_human(person):
person.mother = 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)

https://www.python.org/dev/peps/pep-0008/#programming-recommendations


基本上,如果你在函数中返回非None的值,这意味着返回值是有意义的,并且会被调用者捕获。所以当你返回None时,它也必须是显式的,以传达None在这种情况下有意义,它是可能的返回值之一。

如果你根本不需要返回,你的函数基本上是一个过程,而不是一个函数,所以不要包括return语句。

如果你正在编写一个类似于过程的函数,并且有机会提前返回(即你已经在那里完成了,不需要执行函数的剩余部分),你可以使用空的returns来告诉读者这只是一个执行的早期结束,隐式返回的None值没有任何意义,也不意味着被捕获(类似于过程的函数总是返回None)。