Python 返回,不返回,完全不返回?
考虑三个功能:Python 返回,不返回,完全不返回?,python,null,return,Python,Null,Return,考虑三个功能: def my_func1(): 打印“Hello World” 一无所获 定义我的函数2(): 打印“Hello World” 返回 定义我的函数3(): 打印“Hello World” 他们似乎都没有回报。这些函数的返回值的行为方式是否存在差异?有什么理由选择其中一个而不是另一个吗?它们都返回相同的单例None——没有功能上的差异 我认为省略return语句是一种合理的习惯用法,除非您需要它提前中断函数(在这种情况下,裸return更常见),或者返回除None之外的其他内容。
def my_func1():
打印“Hello World”
一无所获
定义我的函数2():
打印“Hello World”
返回
定义我的函数3():
打印“Hello World”
他们似乎都没有回报。这些函数的返回值的行为方式是否存在差异?有什么理由选择其中一个而不是另一个吗?它们都返回相同的单例
None
——没有功能上的差异
我认为省略return
语句是一种合理的习惯用法,除非您需要它提前中断函数(在这种情况下,裸return
更常见),或者返回除None
之外的其他内容。当函数中有另一个路径返回非None
的内容时,编写返回None
也是有意义的,而且似乎是惯用的。显式地写出return None
可以直观地提示读者,还有另一个分支返回更有趣的内容(调用代码可能需要处理这两种类型的返回值)
在Python中,返回None
的函数通常与C中的void
函数一样使用——它们的目的通常是对输入参数进行操作(除非使用全局数据(抖动))。返回None
通常会使变元更为明确。这使得从“语言约定”的角度来看,为什么省略return
语句更有意义变得更加清楚
这就是说,如果你在一个已经有了关于这些事情的预设约定的代码库中工作,我肯定会照做,以帮助代码库保持统一…在实际行为上,没有区别。它们都返回
None
,仅此而已。然而,所有这些都有一个时间和地点。
下面的说明基本上是不同的方法应该如何使用(或者至少是我被教导应该如何使用),但它们不是绝对的规则,所以如果你觉得有必要,你可以将它们混合起来
使用返回无
这表明函数确实要返回一个值供以后使用,在本例中,它返回None
。该值None
可以在其他地方使用<如果函数中没有其他可能的返回值,则“代码>返回无”
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()
在下面的示例中,如果给定的人
是人,则返回人
的母亲
。如果它不是人类,我们返回无
,因为人
没有母亲(假设它不是动物或其他东西)
使用返回
这与循环中的中断的原因相同。返回值无关紧要,您只想退出整个函数。它在某些地方非常有用,即使你不经常需要它
我们有15名囚犯,我们知道其中一人有刀。我们一个接一个地检查每个囚犯是否有刀。如果我们用刀子打人,我们可以退出该功能,因为我们知道只有一把刀,没有理由检查其余的囚犯。如果我们没有用刀找到囚犯,我们会发出警报。这可以通过许多不同的方式完成,使用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()
注意:您永远不应该使用_knife()执行var=find _capital\u操作,因为返回值不是要捕获的
使用no返回
这也将返回None
,但该值不打算被使用或捕获。这仅仅意味着函数成功结束。与C++、java等语言中的<代码>空> <代码>函数基本相同。
在下面的示例中,我们设置了此人母亲的姓名,然后该函数在成功完成后退出
def set_mother(person, mother):
if is_human(person):
person.mother = mother
注意:您永远不应该执行var=set\u-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
不同之处在于风格,但请注意,要求使用一致:
在返回语句中保持一致。中的所有返回语句
函数应该返回一个表达式,或者它们都不应该返回。如果有的话
return语句返回一个表达式,其中
返回的值应显式地将其声明为“返回无”,并且
显式返回语句应该出现在函数的末尾
(如果可以到达)
是的:
def foo(x):
如果x>=0:
返回math.sqrt(x)
其他:
一无所获
def巴(x):
如果x<0:
一无所获
返回math.sqrt(x)
否:
def foo(x):
如果x>=0:
返回math.sqrt(x)
def巴(x):
如果x<0:
返回
返回math.sqrt(x)
基本上,如果在函数中返回non-None
值,则表示返回值有意义,并且要被调用者捕获。因此,当您返回None
时,它也必须是显式的,以传达None
在这种情况下具有意义,它是可能的返回值之一
如果您根本不需要返回,那么您的函数基本上是作为一个过程而不是一个functi来工作的