Python – 返回,返回None,根本不返回

考虑三个function:

def my_func1(): print "Hello World" return None def my_func2(): print "Hello World" return def my_func3(): print "Hello World" 

他们都似乎返回None。 这些函数的返回值是如何performance的? 有什么理由更喜欢一个人呢?

在实际行为上,没有区别。 他们都返回None ,就是这样。 但是,所有这些都有一个时间和地点。 下面的说明基本上是应该如何使用不同的方法(或至less我是如何教他们应该使用),但他们不是绝对的规则,所以你可以混合起来,如果你觉得有必要。

使用return None

这表明该函数确实意味着返回一个值供以后使用,在这种情况下返回None 。 这个值可以在其他地方使用。 如果函数没有其他可能的返回值,则return None

在下面的例子中,如果给出的人是人类,我们会返回人的母亲。 如果它不是人类,我们会返回None因为这个“人”没有母亲(假设它不是一个动物)。

 def get_mother(person): if is_human(person): return person.mother else: return None 

使用return

这与循环中的break相同。 返回值并不重要,你只想退出整个函数。 这在某些地方是非常有用的,即使你经常不需要它。

我们有15名囚犯,我们知道其中一人有一把刀。 我们循着每个囚犯一个接一个地检查他们是否有刀。 如果我们用刀打人,我们可以退出function,因为我们知道,只有一把刀,没有理由检查囚犯的其余部分。 如果我们没有用刀find这个囚犯,我们就提醒一下。 这可以用许多不同的方法来完成,使用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 ,但是这个值并不意味着被使用或被捕获。 它只是意味着function成功结束。 这与C ++或Java等语言中的void函数的return基本相同。

在下面的例子中,我们设置了人的母亲的名字,然后function成功完成后退出。

 def set_mother(person, mother): if is_human(person): person.mother = mother 

注意:你不应该做var = set_mother(my_person, my_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 – 没有function差异。

我认为,除非你需要早日退出函数(在这种情况下,一个普通的return更常见),否则返回非“ None东西是合理的。 这也是有道理的,似乎是写作return None惯例,当它在一个函数,有另一个path返回非None东西。 写入return None显式是一个可视的提示给读者,有另一个分支返回一些更有趣的东西(调用代码可能需要处理这两种types的返回值)。

通常在Python中,返回None的函数就像C中的void函数一样使用 – 它们的目的通常是对input参数进行操作(除非使用全局数据( 颤抖 ))。 返回None通常会更明确地表明参数是变异的。 这使得它更清楚一点,为什么从“语言惯例”的观点来看,把return声明放开是有道理的。

也就是说,如果你在一个已经有了预先约定的代码库中工作,那么我肯定会效仿这个代码来保持统一。