Python有一个很多编程语言都没有的默认值——它的所有函数都会返回一个值,不管你写不写return语句。本文来自“WhyPython”系列。在正式开始之前,我们以之前讨论过的pass语句和...object为例,看看Python函数是如何“无中生有”的:可以看出,我们定义的这两个函数都没有任何return语句,但是调用函数后,可以获得一个返回值。它们的执行效果和直接写return语句是完全一样的:这4个例子分两种:一种是不写return,但是有隐藏的return返回值;一个写return,其实是有返回值的。也就是说,后者在语义和行为上是一致的,而前者虽然在语义上缺失,但有实际的行为和结果;后者的行为是显性的,而前者是隐性的。《Python之禅》中有一句话“Explicitisbetterthanimplicit(显式优于隐式)”,但是,为了简洁方便(Simpleisbetterthancomplex),其实Python中很多行为都是隐式的,一些语法层面的东西会交给解释器来完成。上一期的真值判断是一种隐性行为,本文前两个例子也是。使用dis查看字节码,可以看到背后的小动作:在这张对比图中,可以看出上面四个函数的解释器指令是完全一样的!不管return有没有写,都会执行return的逻辑,默认返回值为None。那么,问题来了:为什么Python函数可以默认返回None?它是如何实现的?答案在于解释器。当CPython解释器执行到函数的最后一个代码块时,如果发现没有返回值,会主动添加一个Py_None值返回(from:compile.c):即如果定义的函数没有返回一个值,Python解释器默认会(强行)给我们注入一个返回逻辑!对于口译员的这种额外服务,你是觉得很贴心,还是嫌弃麻烦?这样的做法,看似没有多大好处,但似乎也没什么坏处吧?那么,这又会引出新的问题:为什么Python要求函数有返回值?为什么它不像某些语言那样提供void关键字来支持定义没有返回值的空函数呢?关于这个问题,我们会在下一篇《WhyPython》系列文章中揭晓。如果您觉得这些问题很有启发性,那么您应该喜欢这些文章:1.为什么Python使用缩进来划分代码块?2、Python的缩进是反人类的设计吗?3.为什么Python不使用分号作为语句终止符?4.为什么Python没有main函数?为什么我不推荐写主函数?5、为什么Python推荐蛇类命名法?6、为什么Python不支持i++自增语法,也不提供++运算符?7、为什么Python只需要一条语句“a,b=b,a”就可以直接交换两个变量?8.为什么Python要用#作为注释符号?9.为什么Python有pass语句?10.为什么Python有一个奇怪的“...”对象?11、为什么Python可以支持任意真值判断?本文属于“WhyPython”系列(Python猫出品),主要关注Python的语法、设计、开发等话题。它以每一个“为什么”的问题为切入点,试图展示Python的魅力。所有文章都会存档在Github上,项目地址:https://github.com/chinesehuazhou/python-whydo
