不还,不还,一点也不还?

2024-04-24 16:12:31 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑三个功能:

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

def my_func2():
  print "Hello World"
  return

def my_func3():
  print "Hello World"

它们似乎都没有返回。这些函数的返回值的行为有什么不同吗?有没有什么理由更喜欢其中一个?


Tags: 函数功能nonehelloworldreturnmydef
3条回答

是的,他们都一样。

我们可以检查解释过的机器代码,以确认它们都在做完全相同的事情。

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可以在其他地方使用。^如果函数中没有其他可能的返回值,则{}永远不会使用。

在下面的示例中,如果给定的person是人,则返回personmother。如果它不是人类,我们返回None,因为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,但该值不是用来或捕获的。这仅仅意味着函数成功结束。在C++、java等语言中,^ ^ }基本上与^ {CD12}函数相同。

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

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

注意:您不应该这样做var = set_mother(my_person, my_mother),因为返回值不应该被捕获。

它们各自返回相同的单体None——没有函数差异。

我认为,省略return语句是一种合理的习惯用法,除非您需要它提前脱离函数(在这种情况下,更常见的是一个空的return),或者返回None以外的内容。当它位于另一个路径而不是返回None的函数中时,编写return None也很有意义,而且似乎很习惯。显式地写出return None是向读者发出的一个视觉提示,即有另一个分支返回更有趣的内容(调用代码可能需要处理这两种类型的返回值)。

通常在Python中,返回None的函数就像C中的void函数一样使用——它们的目的通常是对输入参数进行操作(除非您使用的是全局数据(shubders)。返回None通常会使参数发生变异变得更加明确。这就更清楚地说明了为什么从“语言约定”的角度省略return语句是有意义的。

也就是说,如果你在一个已经有了关于这些事情的预设约定的代码库中工作,我肯定会跟进以帮助代码库保持一致。。。

相关问题 更多 >