0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

科普:Python函数默认返回 None 的原因

如意 来源:Python猫 作者:豌豆花下猫 2020-08-17 11:39 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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 解释器就会(强行地)默认给我们注入一段返回逻辑!

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

这样的做法似乎没多少好处,但似乎也没有坏处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    90

    文章

    3730

    浏览量

    97554
  • python
    +关注

    关注

    59

    文章

    4892

    浏览量

    90472
  • 解释器
    +关注

    关注

    0

    文章

    103

    浏览量

    7035
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    返回HSE_SRV_RSP_INVALID_PARAM不可缓存为什么

    ” “Crypto_43_HSE_KeyElementSet” 返回HSE_SRV_RSP_INVALID_PARAM。可能的原因是什么?此外,我确认 Crypto 使用的所有 RAM 都配置为不可缓存。
    发表于 05-27 08:24

    MCU的系统时钟从默认的8MHz改为48MHz后,程序跑飞,不能调试是什么原因

    MCU的系统时钟从默认的8MHz改为48MHz后,程序跑飞,不能调试是什么原因
    发表于 01-27 08:05

    函数指针介绍

    这种函数应该都很熟悉,其实就是一个函数,然后返回值是一个 int 类型,是一个数值 int *fun(int x,int y); 这和上面那个函数唯一的区别就是在
    发表于 01-21 08:11

    ElfBoard嵌入式教育科普|Linux系统I/O接口:Open函数详解

    1.函数概述open()是Linux/Unix内核提供的底层系统调用,核心功能是打开或创建文件。成功调用后,内核会返回一个整型的文件描述符作为该文件的句柄,后续的所有读写操作都基于此描述符进行。调用
    的头像 发表于 12-29 11:41 1420次阅读
    ElfBoard嵌入式教育<b class='flag-5'>科普</b>|Linux系统I/O接口:Open<b class='flag-5'>函数</b>详解

    如何用好 C 语言函数返回值?

    myopen(),用于打开某个文件,那么,这个函数要么能够成功打开文件,要么打开文件失败,这时,可以通过返回值区分“成功”和“失败”。 当然,myopen() 函数失败的原因可能很多
    发表于 12-25 07:17

    没有专利的opencv-python 版本

    GUI 依赖,且默认禁用 nonfree 专利模块),版本需与核心版一致: # 先安装核心版,再安装配套 contrib 无头版(避免专利风险) pip install opencv-python
    发表于 12-13 12:37

    函数指针及指针函数的区别

    指针的函数,即本质是一个函数函数返回类型是某一类型的指针   类型标识符 *函数名(参数表)   int *f(x,y);   首先它是一
    发表于 12-12 06:34

    函数指针的概念

    函数返回值类型 (* 指针变量名) (函数参数列表); “函数返回值类型”表示该指针变量可以指向具有什么
    发表于 12-11 08:10

    使用setjmp及longjmp函数处理异常

    是一个用于传递跳转原因的整数值,它不能为0。setjmp函数用于设置跳转点,并返回0;longjmp函数用于跳转到跳转点,并使setjmp函数
    发表于 12-11 08:00

    检查函数返回值的错误和异常处理方法

    检查函数返回值:这是最常见也最基本的错误处理和异常处理方法,就是在调用一个函数后,检查其返回值是否符合预期或是否表示出错或失败。如果出错或失败,则根据
    发表于 12-11 06:48

    飞凌嵌入式ElfBoard-文件I/O的了解探究之返回错误处理与相关函数

    errno仅返回数值,还需查阅错误宏定义才能知道具体错误原因,由此引入以下两个标准c库函数。perror用于在发生系统调用错误时输出有关错误信息的描述。当一个系统调用或库函数发生错误时
    发表于 11-21 08:50

    termux如何搭建python游戏

    模拟器,支持通过APT包管理器安装软件。搭建Python游戏开发环境前需完成以下基础配置: 1. 更换国内源 为提升下载速度,需替换Termux默认源为清华源,执行以下命令: ```bash
    发表于 08-29 07:06

    科普|通信射频接头学习

    科普|通信射频接头学习
    的头像 发表于 08-19 17:09 1131次阅读
    <b class='flag-5'>科普</b>|通信射频接头学习

    调用Cy_ReadFuseByte()函数返回0xF0000005是怎么回事?

    。 当我们调用 Cy_ReadFuseByte() 函数时,返回的是 0xF0000005(熔断 eFuse 的软件流程中的第 5 步) 遵循架构参考手册和数据表: “在过渡到安全或带调试的安全
    发表于 07-24 07:08

    itop-3568开发板机器视觉opencv开发手册-图像绘制-画线

    函数功能: 绘制一条直线。 函数原型: cv2.line(img,pt1,pt2,color,thickness=None,lineType=None,shift=
    发表于 06-04 10:38