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

    浏览量

    69638
  • python
    +关注

    关注

    57

    文章

    4856

    浏览量

    89551
  • 解释器
    +关注

    关注

    0

    文章

    103

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    飞凌嵌入式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

    S32K144使用MCAL配置MCU时钟时,调用Mcu_GetPLlStatus()函数没有返回PLL_LOCKED信号的原因

    当我使用 MCAL 配置 MCU 时钟时,调用 Mcu_GetPLlStatus () 函数没有返回 PLL_LOCKED 信号。我发现在这个 MCU_initClock() 函数中没有正确设置
    发表于 04-11 07:26

    使用STM32L476RCT6 HAL_FLASHEx_Erase()函数,擦除失败的原因

    MCU型号: STM32L476RCT6 大家有用过 HAL_FLASHEx_Erase() 这个函数吗? 我根据官方例程写的代码,读写都能成功,但是擦除失败。调用擦除函数
    发表于 03-10 06:14

    使用Yolo-v3-TF运行OpenVINO™对象检测Python演示时的结果不准确的原因

    通过模型下载器下载了 yolo-v3-tf: ./downloader.py --name yolo-v3-tf 通过模型 优化器转换模型: python3 ./model_optimizer
    发表于 03-06 06:31

    调用DLPC34XX_WriteOperatingModeSelect(DLPC34XX_OM_SENS_INTERNAL_PATTERN)函数返回的是1,为什么?

    我们在64位的代码中,调用DLPC34XX_WriteOperatingModeSelect(DLPC34XX_OM_SENS_INTERNAL_PATTERN)函数返回的是1,意思应该是程序
    发表于 02-17 08:29

    Python绘图Matplotlib快速参考手册

     PYTHON
    发表于 02-07 14:04 0次下载

    使用Python实现xgboost教程

    使用Python实现XGBoost模型通常涉及以下几个步骤:数据准备、模型训练、模型评估和模型预测。以下是一个详细的教程,指导你如何在Python中使用XGBoost。 1. 安装XGBoost
    的头像 发表于 01-19 11:21 2200次阅读

    C语言如何处理函数返回

    当你在函数的最后写上 return 0 的时候,它是如何返回给调用函数的? 比如 test 函数,为了待会更好的看懂汇编代码,我写成了 return 1234。 处理
    的头像 发表于 01-16 09:21 747次阅读

    如何把两个数据返回给调用函数

    函数的处理结果包含两个数据,如何把两个数据返回给调用函数? 第一种,把两个数据封装成一个结构体,函数返回结构体。 调用
    的头像 发表于 01-08 10:15 676次阅读

    TimSort:一个在标准函数库中广泛使用的排序算法

    排序算法呢? 本文将带你走进 TimSort,一个在标准函数库中广泛使用的排序算法。 这个算法由工程师 Tim Peters 于 2001 年专为 Python 设计,并自 Python 2.3 版本起
    的头像 发表于 01-03 11:42 950次阅读

    ADS8684对Command寄存器进行配置时,返回的是0xffff,这是什么原因

    HAL_SPI_TransmitReceive(&hspi1,ADTxbuf,ADRxbuf,0X04,100);返回的是Program寄存器的地址(左移一位加写命令1),对Command寄存器进行配置时,返回的是0xffff。请问这是什么
    发表于 12-20 07:48