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