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

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

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1259  
  IPD(Integrated Product Development)流程管理作为一种先进的产品开发管理理念和方法,在提升企业创新能力方面发挥着至关重要的作用。它打破了传统产品开发过程中部门之间的壁垒,通过整合资源、优化流程,实现产品的快速、高效开发,为企业在激烈的市场竞争中赢得优势。IPD流程管理的核心概念IPD流程...
IPD流程中PDCP是什么意思   11  
  IPD(Integrated Product Development)流程管理作为一种先进的产品开发管理模式,旨在通过整合各种资源,实现产品的高效、高质量开发。在这一过程中,团队协作无疑是成功的关键。有效的团队协作能够打破部门壁垒,促进信息共享,提升决策效率,从而确保产品开发项目顺利推进。接下来,我们将深入探讨IPD流...
IPD培训课程   9  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发理念和方法,在众多企业中得到了广泛应用。它旨在打破部门壁垒,整合资源,实现产品开发的高效、协同与创新。在项目周期方面,IPD研发管理体系有着深远且多维度的影响,深入剖析这些影响,对于企业优化产品开发流程、提升市场竞争...
华为IPD流程   11  
  IPD(Integrated Product Development)流程管理是一种先进的产品开发管理模式,旨在通过整合企业的各种资源,实现产品的高效、高质量开发。它涵盖了从产品概念提出到产品退市的整个生命周期,对企业的发展具有至关重要的意义。接下来将详细阐述IPD流程管理的五个阶段及其重要性。概念阶段概念阶段是IPD...
IPD概念阶段   12  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用