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来工作的