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

2024-11-28 08:37:00
admin
原创
110
摘要:问题描述:考虑以下三个函数: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:

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1041  
  IPD(Integrated Product Development,集成产品开发)是一种系统化的产品开发方法论,旨在通过跨职能团队的协作,优化产品开发的效率和质量。IPD流程强调从市场需求出发,通过并行工程、跨部门协作和阶段性评审,确保产品从概念到上市的每个环节都高效且可控。随着敏捷开发方法的普及,越来越多的企业开始...
华为IPD流程   34  
  随着企业产品开发复杂度的提升以及市场需求的快速变化,传统的产品开发模式逐渐显现出局限性。集成产品开发(IPD)流程与敏捷开发(Agile Development)作为两种主流的开发方法论,分别从系统化管理和快速响应需求的角度为企业提供了解决方案。然而,单独使用其中一种方法往往无法完全满足企业在效率、质量和创新上的多重需...
华为IPD流程   31  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司成功的关键因素之一。它不仅帮助华为在技术上实现了快速创新,还通过市场导向确保了产品的商业成功。IPD流程通过整合技术与市场双驱动,实现了从需求定义到产品交付的全生命周期管理。这种模式不仅提高了产品的开发效率,还降低了市...
IPD流程中PDCP是什么意思   23  
  在研发领域,集成产品开发(IPD)流程已经成为企业提升创新效率和市场竞争力的重要手段。然而,资源分配的不合理往往是制约IPD流程效率的关键因素之一。无论是人力资源、财务资源还是技术资源,如何高效分配直接关系到项目的成功与否。优化资源分配不仅能够缩短产品开发周期,还能降低研发成本,提升产品的市场竞争力。因此,掌握资源分配...
IPD流程中CDCP   26  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用