问题:返回,返回无,根本没有返回?
考虑三个功能:
def my_func1():
print "Hello World"
return None
def my_func2():
print "Hello World"
return
def my_func3():
print "Hello World"
它们似乎都返回None。这些函数的返回值的行为方式之间有什么区别吗?是否有任何理由偏爱一个?
回答 0
在实际行为上,没有区别。他们都回来了None
,就是这样。但是,所有这些都有时间和地点。以下说明基本上是应如何使用不同方法的方法(或至少应告诉我应如何使用它们的方法),但是它们不是绝对规则,因此您可以根据需要将它们混合使用。
使用 return None
这说明该函数确实是要返回一个值供以后使用,在这种情况下,它返回None
。None
然后可以在其他地方使用此值。return None
如果该函数没有其他可能的返回值,则永远不要使用。
在下面的例子中,我们返回person
的mother
,如果person
给出的一个人。如果不是人类,我们将返回,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等语言return
中的void
函数相同。
在下面的示例中,我们设置了人的母亲的名字,然后该函数在成功完成后退出。
def set_mother(person, mother):
if is_human(person):
person.mother = mother
注意:绝对不要这样做var = set_mother(my_person, my_mother)
,因为返回值不是要捕获的。
回答 1
是的,它们都是一样的。
我们可以查看解释后的机器代码,以确认它们都在做完全相同的事情。
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
回答 2
它们每个都返回相同的单例None
-功能上没有差异。
我认为,return
除非您需要先退出该函数(在这种情况下,裸露return
更为常见)或返回除以外的其他值,否则放弃该语句是很习惯的做法None
。它也很有意义,并且return None
在函数中具有返回除之外的其他值的函数时似乎是惯用的None
。return None
明确地写出来是读者的视觉提示,还有另一个分支返回更有趣的内容(并且调用代码可能需要处理两种类型的返回值)。
返回的函数通常在Python None
中像void
C中的函数一样使用-它们的目的通常是在适当的位置对输入参数进行操作(除非您正在使用全局数据(shudders))。None
通常,返回可以使参数更加明确。这使我们更加清楚为什么return
从“语言约定”的角度出发不理会该声明。
就是说,如果您正在使用已经针对这些事情设置了预设约定的代码库,那么我肯定会效仿以帮助使代码库保持一致…
回答 3
正如其他人回答的那样,None
在所有情况下都将返回完全相同的结果。
区别是风格上的,但请注意,PEP8要求使用时要保持一致:
在返回语句中保持一致。函数中的所有return语句应返回一个表达式,或者都不返回。如果任何return语句返回一个表达式,则不返回任何值的任何return语句应将其显式声明为return None,并且在函数的末尾(如果可访问)应存在显式return语句。
是:
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
语句。
如果您正在编写类似过程的函数,并且有机会早点返回(即您已经完成了此操作,不需要执行其余的函数),则可以使用empty return
s向读者发出信号这只是执行的早期完成,None
隐式返回的值没有任何意义,也不意味着被捕获(类似过程的函数始终返回None
)。
回答 4
就功能而言,它们都是相同的,它们之间的区别在于代码的可读性和样式(要考虑的重要因素)