点击蓝色“Python空间”关注我丫程序员
加个“星标”,天天一块儿快乐的学习web

Python 有一项默认的作法,不少编程语言都没有——它的全部函数都会有一个返回值,无论你有没有写 return 语句。 编程
本文出自“Python为何”系列,在正式开始以前,咱们就用以前讨论过的 pass语句 和 …对象 做为例子,看看 Python 的函数是怎样“无中生有”的:微信

能够看出,咱们定义的两个函数都没有写任何的 return 语句,可是在函数调用后,都能取到一个返回值。app
它们的执行效果跟直接写 return 语句相比,是彻底相同的:编程语言

这 4 个例子属于两种类型:一种没有写 return,可是都有隐藏的 return 返回值;一种写了 return,并且实际也有返回值。函数
也就是说,后者在语义和行为上表现一致,前者虽然在语义上缺失,可是却有实际的行为和结果;后者的行为是显性的,前者倒是隐性的。 学习
《Python之禅》中有一句“显性胜于隐性(Explicit is better than implicit)”,可是,出于简洁和便利的考虑(Simple is better than complex),实际上 Python 中有不少行为都是隐性的,会把一些在语法层面的事交给解释器去完成。网站
上一期的 真值判断 是隐性的行为,本文前两个例子也是如此。ui
使用dis
查看字节码,就能够看到其背后的小动做:

在这个对比图中,能够看出上述 4 个函数的解释器指令如出一辙!
无论有没有写 return,它们都会执行 return 的逻辑,并且默认的返回值就是 None。
那么,问题来了:Python 的函数为何能默认返回 None 呢?它是如何实现的呢?
答案就在解释器中,当 CPython 解释器执行到函数的最后一个代码块时,若发现没有返回值,它就会主动地加上一个 Py_None 值返回(出自:compile.c):

也就是说,若是定义的函数没有返回值,Python 解释器就会(强行地)默认给咱们注入一段返回逻辑!
对于解释器的这种附赠的服务,你们是以为很贴心,仍是嫌弃它多事呢?
这样的作法彷佛没多少好处,但彷佛也没有坏处?
那么,这就会引出新的问题:Python 为何要求函数都要有返回值呢?为何它不像某些语言那样,提供一个 void 关键字,支持定义无返回值的空函数呢?
我们下期见~
最后我最近建了一个读者交流群,想加入的能够在公众号后台回复「加群」便可~
推荐阅读: 爆肝整理 400 页 《Python 修炼之道》,高清电子书送给一直支持个人读者! GitHub 标星 3.2w+,程序员最该看的网站都在这里了,收藏了事半功倍!
全网最强的开发者技术路线图已经更新到 2020 年!GitHub 标星 114k+,还有中文的!
学妹揪着让我推荐一波 Python 视频和书单,为了让她再也不烦我,我总结了这些。
👆扫描上方二维码便可关注
本文分享自微信公众号 - Python空间(Devtogether)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。