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

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

3天内不再提示

Python 函数默认返回None的原因

如意 来源:博学园 作者:吾非鱼 2020-08-21 10:51 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Python 函数默认返回None是什么原因?定义的函数没有返回值,Python 解释器就会强行地默认给注入一段返回逻辑!实际上 Python 中有很多行为都是隐性的。

Python 有一项默认的做法,很多编程语言都没有,所有函数都会有一个返回值,不管有没有写 return 语句。

在正式开始之前,用pass语句 和 …对象 作为例子,看下 Python 的函数返回值:

Python 函数默认返回None的原因

定义的两个函数都没有写任何的 return 语句,但是在函数调用后,都能取到一个返回值。执行效果跟直接写 return 语句相比,是完全相同的:

Python 函数默认返回None的原因

这 4 个例子属于两种类型:一种没有写 return,但是都有隐藏的 return 返回值;一种写了 return,而且实际也有返回值。也就是说,后者在语义和行为上表现一致,前者虽然在语义上缺失,但是却有实际的行为和结果;后者的行为是显性的,前者却是隐性的。

《Python之禅》中有一句“显性胜于隐性(Explicit is better than implicit)”,但是,出于简洁和便利的考虑(Simple is better than complex),实际上 Python 中有很多行为都是隐性的,会把一些在语法层面的事交给解释器去完成。

真值判断 是隐性的行为,本文前两个例子也是如此。

使用dis查看字节码,就可以看到其背后的变化:

Python 函数默认返回None的原因

在这个对比图中,可以看出上述 4 个函数的解释器指令一模一样!

不管有没有写 return,它们都会执行 return 的逻辑,而且默认的返回值就是 None。

那么问题来了:Python 的函数为什么能默认返回 None ?如何实现的?

答案就在解释器中,当 CPython 解释器执行到函数的最后一个代码块时,若发现没有返回值,它就会主动地加上一个 Py_None 值返回:

Python 函数默认返回None的原因

如果定义的函数没有返回值,Python 解释器就会(强行地)默认给我们注入一段返回逻辑!

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

    关注

    96

    文章

    2953

    浏览量

    70648
  • python
    +关注

    关注

    58

    文章

    4885

    浏览量

    90310
  • 解释器
    +关注

    关注

    0

    文章

    103

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

    函数指针介绍

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

    如何用好 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

    使用信号处理函数

    处理函数的指针。如果handler为SIG_IGN,则表示忽略该信号;如果handler为SIG_DFL,则表示恢复该信号的默认处理方式。signal函数返回一个指针,指向之前设置的信
    发表于 12-11 06:40

    Termux中调试圣诞树Python代码

    在Termux中调试Python代码(以圣诞树立例)非常简单,核心分为环境准备、代码编写、运行调试三个步骤,下面一步步教你操作: 一、环境准备(首次使用需做) Termux默认可能没有Python
    发表于 12-09 09:02

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

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

    termux如何搭建python游戏

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

    调用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

    HarmonyOS5云服务技术分享--云函数创建配置指南

    。HarmonyOS的AGC平台提供灵活配置,支持Node.js、Python、Java等多种语言,还能自定义运行环境哦! ?️ 二、手把手创建第一个云函数 ​​Step 1:进入云函数控制台​​ 登录
    发表于 05-22 17:08