python:返回、返回 None 以及根本不返回——有什么区别吗?
- 2024-11-28 08:37:00
- admin 原创
- 5
问题描述:
考虑以下三个函数:
def my_func1():
print "Hello World"
return None
def my_func2():
print "Hello World"
return
def my_func3():
print "Hello World"
它们似乎都返回None
。这些函数的返回值行为之间有什么区别吗?有什么理由选择其中一个而不是另一个?
另请参阅:是否有可能不从 Python 中的函数返回任何内容?
解决方案 1:
就实际行为而言,没有区别。它们都返回None
,仅此而已。但是,所有这些都有其时间和地点。以下说明基本上是如何使用不同的方法(或者至少是我被教导应该如何使用它们),但它们不是绝对的规则,因此如果您觉得有必要,您可以混合使用它们。
使用return None
这表明该函数确实要返回一个值以供以后使用,在本例中它返回。然后可以在其他地方使用None
这个值。如果函数没有其他可能的返回值,则永远不会使用 。None
`return None`
在以下示例中,如果给定的是人类,则person
返回。如果不是人类,则返回,因为没有(假设它不是动物或其他东西)。mother
`personNone
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
,但该值不用于使用或捕获。它只是表示函数已成功结束。它return
与void
C++ 或 Java 等语言中的函数基本相同。
在下面的例子中,我们设置了人的母亲的名字,然后函数在成功完成后退出。
def set_mother(person, mother):
if is_human(person):
person.mother = mother
注意:您永远不应该这样做var = set_mother(my_person, my_mother)
,因为返回值不是为了被捕获的。
解决方案 2:
是的,它们都是一样的。
我们可以检查解释后的机器代码以确认它们都在做完全相同的事情。
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
解决方案 3:
正如其他人所回答的那样,结果完全相同,None
在所有情况下都会返回。
区别在于风格,但请注意PEP8要求使用保持一致:
返回语句应保持一致。函数中的所有返回语句要么都应返回一个表达式,要么都不返回。如果任何返回语句都返回一个表达式,则任何未返回任何值的返回语句都应明确说明为 return None,并且函数末尾应有一个明确的返回语句(如果可以找到)。
是的:
def foo(x): if x >= 0: return math.sqrt(x) 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
语句。
如果您正在编写一个类似过程的函数,并且有机会更早返回(即,您已经在那时完成并且不需要执行该函数的剩余部分),您可以使用空的return
s 来向读者发出信号,这只是执行的提前完成,并且None
隐式返回的值没有任何意义,也不打算被捕获(类似过程的函数无论如何总是返回None
)。
解决方案 4:
它们各自返回相同的单例None
——没有功能差异。
我认为省略语句是合理的惯用做法return
,除非您需要提前退出函数(在这种情况下,空语句return
更常见),或者返回除 之外的其他内容。当函数中有另一条路径返回除 之外的内容时,None
这样写也是有道理的,而且似乎很惯用。明确地写出来可以给读者一个视觉提示,即有另一个分支返回更有趣的内容(并且调用代码可能需要处理两种类型的返回值)。return None
`None`return None
在 Python 中,返回函数的None
使用方式与void
C 中的函数类似——它们的用途通常是对输入参数进行操作(除非您使用全局数据 ( shudders ))。返回None
通常会更明确地表明参数已发生改变。这更清楚地说明了为什么return
从“语言惯例”的角度来看省略语句是有意义的。
也就是说,如果您在已经有关于这些内容的预设约定的代码库中工作,我肯定会遵循这些约定来帮助代码库保持统一......
解决方案 5:
就功能而言,这些都是相同的,它们之间的区别在于代码的可读性和风格(这也是需要考虑的重要因素)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件