考虑以下三个功能:
def my_func1():
print "Hello World"
return None
def my_func2():
print "Hello World"
return
def my_func3():
print "Hello World"
它们似乎都返回None。这些函数的返回值之间的行为有什么不同吗?有什么理由让你更喜欢其中一个而不是另一个吗?
另请参阅:是否可能不从python中的函数返回任何内容?
考虑以下三个功能:
def my_func1():
print "Hello World"
return None
def my_func2():
print "Hello World"
return
def my_func3():
print "Hello World"
它们似乎都返回None。这些函数的返回值之间的行为有什么不同吗?有什么理由让你更喜欢其中一个而不是另一个吗?
另请参阅:是否可能不从python中的函数返回任何内容?
当前回答
是的,它们都一样。
我们可以检查已解释的机器码,以确认它们都在做完全相同的事情。
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
其他回答
就功能而言,它们都是相同的,它们之间的区别在于代码可读性和风格(这是需要考虑的重要因素)
是的,它们都一样。
我们可以检查已解释的机器码,以确认它们都在做完全相同的事情。
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,就是这样。然而,所有这些都是有时间和地点的。 下面的说明基本上是不同的方法应该如何使用(或者至少是我被教导应该如何使用),但它们不是绝对的规则,所以如果你觉得有必要,你可以混合使用它们。
使用return None
这表明该函数确实是为了返回一个值供以后使用,在本例中它返回None。这个值None可以在其他地方使用。如果函数没有其他可能的返回值,则从不使用None。
在下面的例子中,如果person是一个人,我们返回person的母亲。如果它不是人类,我们返回None,因为这个人没有母亲(让我们假设它不是动物或其他东西)。
def get_mother(person):
if is_human(person):
return person.mother
else:
return None
使用返回
这与循环中断的原因相同。返回值不重要,你只想退出整个函数。它在某些地方非常有用,即使你不经常需要它。
We've got 15 prisoners and we know one of them has a knife. We loop through each prisoner one by one to check if they have a knife. If we hit the person with a knife, we can just exit the function because we know there's only one knife and no reason the check rest of the prisoners. If we don't find the prisoner with a knife, we raise an alert. This could be done in many different ways and using return is probably not even the best way, but it's just an example to show how to use return for exiting a function.
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_囚徒er_with_knife(),因为返回值并不意味着要被捕获。
使用完全不返回
这也将返回None,但该值并不用于使用或捕获。它仅仅意味着函数成功结束。它基本上与c++或Java等语言中的void函数中的返回相同。
在下面的例子中,我们设置了一个人的母亲的名字,然后函数成功完成后退出。
def set_mother(person, mother):
if is_human(person):
person.mother = mother
注意:永远不要执行var = set_mother(my_person, my_mother),因为返回值不会被捕获。
它们各自返回相同的单例None——没有功能上的差异。
I think that it is reasonably idiomatic to leave off the return statement unless you need it to break out of the function early (in which case a bare return is more common), or return something other than None. It also makes sense and seems to be idiomatic to write return None when it is in a function that has another path that returns something other than None. Writing return None out explicitly is a visual cue to the reader that there's another branch which returns something more interesting (and that calling code will probably need to handle both types of return values).
通常在Python中,返回None的函数就像C中的void函数一样使用——它们的目的通常是对输入参数进行操作(除非你使用全局数据(shudders))。返回None通常更明确地表明参数发生了变化。这就更清楚地说明了为什么从“语言约定”的立场上去掉return语句是有意义的。
也就是说,如果你在一个代码库中工作,这个代码库已经有了关于这些事情的预先设置的约定,我肯定会遵循这个规则来帮助代码库保持统一……
正如其他人回答的那样,结果是完全相同的,在所有情况下都返回None。
区别在于风格,但请注意,PEP8要求使用一致:
Be consistent in return statements. Either all return statements in a function should return an expression, or none of them should. If any return statement returns an expression, any return statements where no value is returned should explicitly state this as return None, and an explicit return statement should be present at the end of the function (if reachable). Yes: 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) No: 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,你的函数基本上就是一个过程,而不是一个函数,所以不要包含return语句。
如果你正在编写一个类过程函数,并且有机会提前返回(即你已经在那一点上完成了,不需要执行函数的剩余部分),你可以使用空返回值来告诉读者这只是一个执行的早期结束,隐式返回的None值没有任何意义,也不意味着被捕获(类过程函数总是返回None)。