关于python:Python-函数为什么会默认返回-None

3次阅读

共计 1381 个字符,预计需要花费 4 分钟才能阅读完成。

Python 有一项默认的做法,很多编程语言都没有—— 它的所有函数都会有一个返回值,不论你有没有写 return 语句。

本文出自“Python 为什么”系列,在正式开始之前,咱们就用之前探讨过的 pass 语句 和 … 对象 作为例子,看看 Python 的函数是怎么“无中生有”的:

能够看出,咱们定义的两个函数都没有写任何的 return 语句,然而在函数调用后,都能取到一个返回值。

它们的执行成果跟间接写 return 语句相比,是完全相同的:

这 4 个例子属于两种类型:一种没有写 return,然而都有暗藏的 return 返回值;一种写了 return,而且理论也有返回值。

也就是说,后者在语义和行为上体现统一,前者尽管在语义上缺失,然而却有理论的行为和后果;后者的行为是显性的,前者却是隐性的。

《Python 之禅》中有一句“显性胜于隐性(Explicit is better than implicit)”,然而,出于简洁和便当的思考(Simple is better than complex),实际上 Python 中有很多行为都是隐性的,会把一些在语法层面的事交给解释器去实现。

上一期的 真值判断 是隐性的行为,本文前两个例子也是如此。

应用 dis 查看字节码,就能够看到其背地的小动作:

在这个比照图中,能够看出上述 4 个函数的解释器指令截然不同!

不论有没有写 return,它们都会执行 return 的逻辑,而且默认的返回值就是 None。

那么,问题来了:Python 的函数为什么能默认返回 None 呢?它是如何实现的呢?

答案就在解释器中,当 CPython 解释器执行到函数的最初一个代码块时,若发现没有返回值,它就会被动地加上一个 Py_None 值返回(出自:compile.c):

也就是说,如果定义的函数没有返回值,Python 解释器就会(强行地)默认给咱们注入一段返回逻辑!

对于解释器的这种附赠的服务,大家是感觉很贴心,还是厌弃它多事呢?

这样的做法仿佛没多少益处,但仿佛也没有害处?

那么,这就会引出新的问题:Python 为什么要求函数都要有返回值呢?为什么它不像某些语言那样,提供一个 void 关键字,反对定义无返回值的空函数呢?

对于这个问题,咱们将在下一期“Python 为什么”系列文章中揭晓。

如果你感觉这些问题很有启发性,那你应该会喜爱这些文章:

1、Python 为什么应用缩进来划分代码块?

2、Python 的缩进是不是反人类的设计?

3、Python 为什么不必分号作语句终止符?

4、Python 为什么没有 main 函数?为什么我不举荐写 main 函数?

5、Python 为什么举荐蛇形命名法?

6、Python 为什么不反对 i++ 自增语法,不提供 ++ 操作符?

7、Python 为什么只需一条语句“a,b=b,a”,就能间接替换两个变量?

8、Python 为什么用 # 号作正文符?

9、Python 为什么要有 pass 语句?

10、Python 为什么会有个奇怪的“…”对象?

11、Python 为什么能反对任意的真值判断?

本文属于“Python 为什么”系列(Python 猫出品),该系列次要关注 Python 的语法、设计和倒退等话题,以一个个“为什么”式的问题为切入点,试着展示 Python 的迷人魅力。所有文章将会归档在 Github 上,我的项目地址:https://github.com/chinesehuazhou/python-whydo

正文完
 0