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

ff36bc09a61337f7ccff77e905c1e29d.png

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

本文出自“Python为什么”系列,在正式开始之前,我们就用之前讨论过的 pass语句和 …对象 作为例子,看看 Python 的函数是怎样“无中生有”的:

fce345a3a742342dc2a1995ee6416f6d.png

可以看出,我们定义的两个函数都没有写任何的 return 语句,但是在函数调用后,都能取到一个返回值。

它们的执行效果跟直接写 return 语句相比,是完全相同的:

78b713494eceb2dd979f7287f4ff5fac.png

这 4 个例子属于两种类型:一种没有写 return,但是都有隐藏的 return 返回值;一种写了 return,而且实际也有返回值。

也就是说,后者在语义和行为上表现一致,前者虽然在语义上缺失,但是却有实际的行为和结果;后者的行为是显性的,前者却是隐性的。

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

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

使用dis查看字节码,就可以看到其背后的小动作:

e9b978c5ee1b6ab4d8d3fdf29659c016.png

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

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

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

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

b3fdcef1a197101cb78f03016ce47ac9.png

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache CXF 3.0:JAX-RS 2.0和Bean验证1.1最终一起

即将发布的出色的Apache CXF框架3.0版 (当前处于里程碑2阶段)带来了许多有趣且有用的功能,越来越接近提供完整的JAX-RS 2.0支持。 Bean Validation 1.1的支持是我们中许多人期盼已久的功能之一:简单而简洁的模型可为您的REST服务层…

windows.onload和body的onload属性的区别

关于windows.onload和body的onload属性的区别网上有些说法说的也不太统一,现在系统说下: 先看共同点: 都是body内容体加载结束执行; window.onload 内部方式可以 推荐的 body onload属性: 内联或者内嵌方式可以, 内部也可以 首先,这两个onlo…

行高 line-height

一、行高的定义line-height(行高):两行文字基线之间的距离1、什么是基线?2、为何是基线?3、需要两行吗?1、什么是基线?我们上学的时候都用过,抄写英文字母的时候。其中有一条红线,这个红线就是基…

实验七报告

一、实验结论 part1:验证性实验 1.验证性实验2 如果事先不知道学生人数,尝试对line29做如下修改后,程序运行结果是否正确?回答问题,并给出运行结果截图。 运行结果正确// 将file1.txt中小写字母转换成大写后&#xff…

Lambda表达式和流API:基本示例

该博客文章包含基本Lambda表达式和Stream API示例的列表,我在2014年6月在Java用户组– Politechnica Gedanensis (格但斯克技术大学)和Goyello的实时编码演示中使用了这些示例。 Lambda表达式 句法 最常见的示例: Runnable runn…

示波器1m和50欧姆示阻抗匹配_阻抗匹配,示波器,50欧姆电阻,他们之间是什么关系?(第一回)...

首先思考这样一个问题,下面这个测量实验中,示波器的测量结果是多少?是和信号源一样的5V吗?先别着急回答,假如里面的信号源和示波器不是理想型 ,而是和现实中一样带有内部阻抗的元件,见下图&…

Ajax jquery的库的简化版本

Ajax jquery的库的简化版本 (function(){ //面向外界的唯一变量接口! var myajax window.myajax {}; //作者、版本号等等信息 myajax.author "考拉"; myajax.version "1.0.0"; //这个对象有两个属性,get、pos…

10月23日java web培训日记

分析了客户端身份认证的例子程序,讲解到Digest认证时,顺便提了一下SSLServerSocket,要求学员们能够通过SSLServerSocket的创建过程阐述工厂模式 为了更好地读懂AuthenticateServlet这个Servlet,要先明白两次请求的处理代码都放在了…

全局参数使用

1. $_SERVER[HTTP_ACCEPT] 返回来自当前请求的请求头。 场景,校验提交的数据前,看是不是 post请求 if ($_SERVER["REQUEST_METHOD"] "POST") { echo "请求方式是post" } 转载于:https://www.cnblogs.com/kaibindirver/p/…

XPath语法规则及实例

XPath语法规则及实例 XPath语法规则一、XPath术语: 1.节点:在XPath中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。 XML文档是被作为节点树来对待的。树的根被称为文档…

Spring测试上下文缓存+ AspectJ @Transactional + Ehcache的痛苦

您在使用AspectJ Transactionals和Spring吗? 您是否有多个SessionFactory,也许一个用于嵌入式数据库进行单元测试,一个用于实际数据库进行集成测试? 您是否遇到这些例外之一? org.springframework.transaction.Cannot…

WorkPlus超级APP助力企业节省IT人力成本,实现快速移动化

在信息化时代,移动应用已经成为企业发展的重要组成部分。然而,开发和维护原生客户端的成本却相对较高,需要大量的iOS、安卓和桌面端工程师。为了解决这一问题,WorkPlus作为一个功能完备的超级APP,为企业节约了大量的IT…

hujingwei oracle_Oracle收缩表空间

可以使用 alter database datafile file path... resize xM 的命令来缩小数据文件。SELECT alter database datafile || A.FILE_NAME || resize ||ROUND(A.FILESIZE - (A.FILESIZE - C.HWMSIZE - 100) * 0.8) || M;,A.FILESIZE || M AS "数据文件的总大小", C.HWM…

addEventListener的click和onclick的区别

前两节都和addEventListener的click有关,于是在想它与onclick有什么区别呢,自己调试了一下,网上也有相关资料 事件绑定 onclick绑定方式 优点: - 简洁 - 处理事件的this关键字指向当前元素 缺点: - 不能对事件捕获或…

学车日记

今天是正式开始学车,先考交规,今天早上要赶驾校的班车,所以必须6点起床,那叫一个难受呀,好像已经有很长时间没有这么早起过了,不过经过复杂的思想斗争我终于还是如期起床了,今天要是赶不上班车错…

ApiCloud利用NVTabBar模块快速搭建起APP的框架

废话不说&#xff0c;直接上代码 模块地址&#xff1a;https://docs.apicloud.com/Client-API/Nav-Menu/NVTabBar 代码实例&#xff1a; <!doctype html> <html><head><meta charset"utf-8"><meta name"viewport" content"…

Java 8中新的并行API:Glitz和Glamour的背后

我是一个出色的多任务处理者。 即使我在写这篇文章&#xff0c;我仍然可以为昨天在一个大家都对我陌生的聚会上发表的言论感到尴尬。 好消息是&#xff0c;我并不孤单– Java 8在多任务处理方面也相当出色。 让我们看看如何。 Java 8中引入的关键新功能之一是并行数组操作。 这…

有趣的js匿名函数写法(function嵌套)

例子没有什么实际意义&#xff0c;只能做为思路参考 <!DOCTYPE html><html><head><meta charset"UTF-8"><title></title></head><body><script>function ck(a) {console.log(a);return function(b) {console.…

mangouDB和mysql的区别_谈谈mongodb,mysql的区别和具体应用场景

最近对数据库比较感兴趣&#xff0c;于是就去研究了下部分相关热门的数据库。MySQL关系型数据库。在不同的引擎上有不同 的存储方式。查询语句是使用传统的sql语句&#xff0c;拥有较为成熟的体系&#xff0c;成熟度很高。开源数据库的份额在不断增加&#xff0c;mysql的份额页…

ASP.NET 中执行 URL 重写

作者&#xff1a;overred 来源&#xff1a;原创URL 重写就是把URL地址重新改写&#xff08;汗^_^&#xff09;。详情&#xff1a;http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx优点&#xff1a;把url缩短等用法&#xff1a;1.下载ms的…