python:返回、返回 None 以及根本不返回——有什么区别吗?

2024-11-28 08:37:00
admin
原创
6
摘要:问题描述:考虑以下三个函数:def my_func1(): print "Hello World" return None def my_func2(): print "Hello World" return def my_func3(): pr...

问题描述:

考虑以下三个函数:

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`personNoneperson`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,但该值不用于使用或捕获。它只是表示函数已成功结束。它returnvoidC++ 或 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语句。

如果您正在编写一个类似过程的函数,并且有机会更早返回(即,您已经在那时完成并且不需要执行该函数的剩余部分),您可以使用空的returns 来向读者发出信号,这只是执行的提前完成,并且None隐式返回的值没有任何意义,也不打算被捕获(类似过程的函数无论如何总是返回None)。

解决方案 4:

它们各自返回相同的单例None——没有功能差异。

我认为省略语句是合理的惯用做法return,除非您需要提前退出函数(在这种情况下,空语句return更常见),或者返回除 之外的其他内容。当函数中有另一条路径返回除 之外的内容时,None这样写也是有道理的,而且似乎很惯用。明确地写出来可以给读者一个视觉提示,即有另一个分支返回更有趣的内容(并且调用代码可能需要处理两种类型的返回值)。return None`None`return None

在 Python 中,返回函数的None使用方式与voidC 中的函数类似——它们的用途通常是对输入参数进行操作除非您使用全局数据 ( shudders ))。返回None通常会更明确地表明参数已发生改变。这更清楚地说明了为什么return从“语言惯例”的角度来看省略语句是有意义的。

也就是说,如果您在已经有关于这些内容的预设约定的代码库中工作,我肯定会遵循这些约定来帮助代码库保持统一......

解决方案 5:

就功能而言,这些都是相同的,它们之间的区别在于代码的可读性和风格(这也是需要考虑的重要因素)

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   642  
  引言在当今快速变化的科技市场中,企业要想保持竞争力,就必须具备高效的产品开发流程。小米作为一家以创新驱动的科技公司,其集成产品开发(IPD)流程在业界颇受关注。其中,技术路线图规划作为IPD流程的核心环节,对于确保产品技术领先、满足市场需求以及实现长期战略目标至关重要。本文将深入探讨小米IPD流程中的技术路线图规划,分...
华为IPD是什么   0  
  在当今快速变化的商业环境中,项目管理的高效执行是企业成功的关键。为了应对日益复杂的产品开发挑战,企业纷纷寻求将产品开发流程(Product Development Process, PDCP)与集成产品开发(Integrated Product Development, IPD)流程相结合的策略,以实现更高效、更协同的...
IPD管理   0  
  在当今竞争激烈的市场环境中,提高客户满意度是企业持续发展和成功的关键。为了实现这一目标,企业需要不断优化其产品开发和管理流程。IPD(Integrated Product Development,集成产品开发)流程图作为一种高效的项目管理工具,能够帮助企业实现跨部门协作、优化资源配置,并最终提升客户满意度。本文将深入探...
IPD流程是谁发明的   0  
  在项目管理领域,集成产品开发(IPD, Integrated Product Development)流程被视为提升项目成功率的关键框架。IPD通过其系统化的方法,将产品开发过程中的各个阶段紧密连接,确保从概念到市场的每一步都经过深思熟虑和高效执行。本文将深入探讨IPD流程的六个核心阶段如何深刻影响项目成功,并为项目管...
IPD流程中CDCP   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用