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值return(from:compile.c):即如果定义的函数没有return默认情况下,Python解释器将(强制)向我们注入返回逻辑!供解读你觉得设备的这种bonusservice是很贴心,还是觉得很麻烦?这种做法似乎没有太大的好处,但似乎也没有坏处。
