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

对于解释器的这种附赠的服务,大家是觉得很贴心,还是嫌弃它多事呢?这样的做法似乎没多少好处,但似乎也没有坏处?大家有什么疑问可以后台留言或评论哦!

py函数两个返回值_Python 函数为什么会默认返回 None?相关推荐

  1. if python 判断函数返回值_Python函数的返回值和作用域

    函数的返回值和作用域 1.返回值 def guess(x): if x > 3: return "> 3" else: return "<= 3&quo ...

  2. keil5函数 默认返回值_python实用技巧——获取部分返回值的4种方式

    喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远! python的函数支持返回多个值.返回多个值时,默认以tuple的方式返回. 例如,下面两个函数的定义是完全 ...

  3. pythonget返回值_python 函数返回值

    Python 函数返回值 一.函数返回值 返回值作用: 一旦函数调用或执行,那么函数外部的程序,就没办法控制函数的执行过程.此时外部程序只能等待函数执行结果 为什么要等待? 因为外部程序要根据函数的执 ...

  4. python怎么调用函数的返回值_python函数的返回值是什么

    返回值简介 函数需要先定义后调用,函数体中 return 语句的结果就是返回值.如果一个函数没有 reutrn 语句,其实它有一个隐含的 return 语句,返回值是 None,类型也是 'NoneT ...

  5. python中sort返回值_Python函数你真的都学会了吗?来看看这篇Python高阶函数!

    二.高阶函数 高级函数, 英文叫 Higher-order Function. 那么什么是高阶函数呢? 在说明什么是=高阶函数之前, 我们需要对函数再做进一步的理解! 2.1 函数的本质 函数的本质是 ...

  6. python os.system保存返回值_python中os.system的返回值

    python中os.system()的返回值 1.python中的 os.system(cmd)的返回值与linux命令返回值(具体参见本文附加内容)的关系 你们都习惯用os.systemv()函数执 ...

  7. python3 协程 返回值_python asyncio 获取协程返回值和使用callback

    1. 获取协程返回值,实质就是future中的task import asyncio import time async def get_html(url): print("start ge ...

  8. python获取返回值_python 调用 shell ,获取返回值和返回信息

    网络上有各种方案解决python调用shell的解决方案,但是没有一个完美的,以下是本人整理的一个方案,比较完美地解决了同时解决获取返回值和返回信息. def run_linux_cmd_quiet( ...

  9. python3主函数返回值_Python 详解基本语法_函数_返回值

    Python 详解基本语法 概要: 函数的返回值是函数重要的组成部分.函数的根本在于实现程序的部分功能,所以很多时候我们需要将函数执行后的结果返回给程序再由程序作出进一步的操作.可以说是函数的返回值令 ...

最新文章

  1. HTML5 —— 视频/音频
  2. windows server 2008R2 上安装配置freesshd
  3. 使用jar的两点注意事项
  4. redis的关键路径和lazy-free
  5. SQL Server date、datetime、smalldate区别
  6. php点击按钮变文字,点击按钮文字变成input框,点击保存变成文字的实现
  7. JavaScript异步
  8. lingo解题报告内容解释
  9. Almost Arithmetical Progression
  10. 花生采摘(洛谷-P1086)
  11. 《伟大的小细节:互联网产品设计中的微创新思维》——3.2 时间/日期因素
  12. 算法分析-堆排序 HeapSort 优先级队列
  13. 编译原理笔记05-语法分析自底向上
  14. 计算机电脑键盘英语,知识整理:计算机键盘指法练习(英语+数字)
  15. 电脑开机计算机配置,电脑开机显示正在配置更新请勿关闭计算机 重新启动之后,电脑里的数...
  16. 使用EasyExcel上传下载excel
  17. 2DPCA的原理推导与实现
  18. 周易六十四卦——雷火丰卦
  19. char和varchar区别
  20. 挖财获得5000万美元B轮融资 宽带资本和中金领投

热门文章

  1. Teradata Expression 12 在Windows 2003上Connection Reset 问题的解决方法
  2. Jenkins 流水线 获取git 分支列表_基于Jenkins的DevOps流水线实践
  3. excel实战应用案例100讲(十二)-用Excel做一个自动抽奖器
  4. AUTOSAR从入门到精通100讲(三十八)-通信网络中的⽐特和帧同步技术
  5. killall 后面信号_Linux 下使用 killall 命令终止进程的 8 大用法
  6. JavaScript实现继承的方式,不正确的是:
  7. 在linux下安装mongo数据库,Linux系统下安装MongoDB
  8. angularjs的$http请求方式
  9. 让Vue也可以使用Redux
  10. 4 张动图解释为什么(什么时候)使用 Redux