首页
学习
活动
专区
圈层
工具
发布

Python 函数为什么会默认返回 None?

使用dis查看字节码,就可以看到其背后的小动作: 在这个对比图中,可以看出上述 4 个函数的解释器指令一模一样!...不管有没有写 return,它们都会执行 return 的逻辑,而且默认的返回值就是 None。 那么,问题来了:Python 的函数为什么能默认返回 None 呢?它是如何实现的呢?...答案就在解释器中,当 CPython 解释器执行到函数的最后一个代码块时,若发现没有返回值,它就会主动地加上一个 Py_None 值返回(出自:compile.c): 也就是说,如果定义的函数没有返回值...那么,这就会引出新的问题:Python 为什么要求函数都要有返回值呢?为什么它不像某些语言那样,提供一个 void 关键字,支持定义无返回值的空函数呢?...关于这个问题,我们将在下一期“Python为什么”系列文章中揭晓。 如果你觉得这些问题很有启发性,那你应该会喜欢这些文章: 1、Python为什么使用缩进来划分代码块?

2.9K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    为什么Python中的None is None is None == True

    最近在StackOverflow上看到了一个问题,为什么Python中的None is None is None返回True,看到大家的讨论后对Python中的比较运算有了更深的认识。...None is None is None 不同于 (None is None) is None 题主和很多人一开始都认为None is None is None就等同于(None is None) is...括号在比较运算中并不是改变运算优先级,而是直接返回括号内比较运算的结果,这个结果只会是True或者False,而True和False已经不是原来比较的对象了。...Python中连续进行比较运算的底层实现 上一节提到了(3 > 2) > 1在Python中是False,但是懂一点Python的人都知道3 > 2 > 1在Python中是合法的并且返回True,我们可以看一下这一个表达式在...is None is None就是None is None and None is None,结果是True也就没什么问题了。

    2.8K70

    【Python】函数 ④ ( 函数 None 返回值 | None 值应用场景 | 用于 if 判断 | 定义无初始内容变量 | 代码示例 )

    一、函数 None 返回值 1、空返回值 在 Python 函数中 , return 返回值是可选的 , 函数可以没有返回值 ; def 函数名(函数参数): """函数文档字符串(可选)"""...# 函数体 # return 返回值 (可选) Python 函数中没有显示定义返回值 , 那么返回的就是 特殊字面量 None , 其类型是 ; None...- 接收 None 返回值 下面的代码中 , hello 函数没有使用 return 关键字 返回 返回值 ; 该 hello 函数 没有显示定义 返回值 , 实际上该函数返回的是 None 返回值...; 使用变量接收该函数的返回值 , 返回值是 None , 返回值类型是 NoneType ; 代码示例 : """ 接收 函数 None 返回值示例 """ # 定义无返回值的函数 def hello...None 二、None 值应用场景 ---- 1、None 值应用场景简介 函数 None 返回值应用场景 : 函数返回值 : 表示函数没有返回值 ; 用于 if

    1.3K20

    Python 递归函数返回值为 None 的解决办法

    在使用 Python 开发的过程中,避免不了会用到递归函数。但递归函数的返回值有时会出现意想不到的情况。 下面来举一个例子: >>> def fun(i): ... ...return i ... >>> r = fun(0) >>> print(r) 比如上面这段代码,乍一看没什么问题,但返回值并不是我们期望的 5,而是 None。...>>> print(r) None 要解决这个问题也简单,就是在执行递归调用的时候,加上 return 语句。 修改之后的代码如下: >>> def fun(i): ... ...最后补充一句,如果想要了解这背后深层的原理,可以看看函数调用栈相关的资料,这里就不过多介绍了。 本文就到这里了,如果觉得有用的话欢迎点赞,转发和关注,谢谢。

    1.6K00

    小心这个陷阱: 为什么JS中的 every()对空数组总返回 true

    对于一个空数组, every() 无论回调函数是什么都会返回 true ,因为那个回调函数从未被调用过。...这只能发生的唯一原因是如果回调函数没有被调用,而 every() 的默认值是 true 。但是,为什么在没有值来运行回调函数时,空数组会返回 true 给 every() 呢?...要理解为什么,我们需要仔细看看规范是如何描述这个方法的。...如果数组中没有任何项目,那么就没有机会执行回调函数,因此,该方法无法返回 false 。 现在的问题是:为什么 every() 会表现出这样的行为?...这个“存在量词”规定,对于任何空集合,结果都是假的。因此,some() 方法对空集合返回 false,并且也不会执行回调函数。

    1K20

    【Python】函数 ③ ( 函数返回值定义语法 | 函数返回多个返回值 | 代码示例 )

    一、函数返回值定义语法 在 Python 函数中 , 通过 return 关键字 , 可以返回一个结果给调用者 , 这个返回结果就是 函数返回值 ; def 函数名(函数参数): """函数文档字符串..., 可以使用元组(tuple)或者列表(list)存储返回值 , 并将其赋值给一个变量 , 下面的代码 , 就是在函数中 , 返回了两个值 , """ 函数返回值示例 """ # 定义返回多个返回值的函数...(1, 2) 执行结果 : (1, 2) 三、函数返回值代码示例 ---- 在下面的代码中 , 返回了一个返回值 , 使用 sum 变量接收了这个返回值 , 最终将返回值打印出来 ; 代码示例 :...""" 函数返回值示例 """ # 定义函数, 并设置函数返回值 def add(a, b): return a + b # 接收函数返回值 sum = add(1, 2) # 打印函数返回值...print(f"函数返回值为 {sum}") 执行结果 : 函数返回值为 3

    3.6K20

    【JavaScript】函数 ④ ( 函数返回值 | 函数返回值语法 return 关键字 | 函数默认返回值 undefined )

    一、JavaScript 函数返回值 1、函数返回值引入 JavaScript 函数 可以 实现某种特定的功能 , 执行完毕后 , 可以返回一个 " 返回值 " ; 当 函数 被调用执行任务完毕时 ,..." 返回值 " 会被返回给调用者 ; 如果 函数 中没有明确 使用 return 关键字 返回 " 返回值 " , 那么函数会默认返回undefined 值 ; 2、函数返回值语法 在 JavaScript...中 , 函数 返回值是 通过 return 语句实现 , 在函数体 中 使用 return 语句 指定函数返回的值 , 使用 return 语句后 会立即终止函数的执行 , return 返回值 语法如下..., 不需要在 函数 声明中注明 返回值类型 ; 3、函数默认返回值 在下面的代码中 , 定义了 add 函数 , 并且该函数没有 显示使用 return 关键字 返回返回值 ; 此时 执行 add 函数...> 执行结果 : 打印出来的 函数返回值 是 undefined 未定义值 ; 4、函数默认返回值 在下面的代码中 , add 函数 中 使用 return 关键字 返回返回值

    3.1K10

    谈一谈|return None来看递归函数流程解析

    fl=1fn=1for i in range(3,n+1): mid=fl fl=fn fn=fl+midprint(fn) 如果换成递归函数,其实也不难,但是你真的能理解这个递归函数的运行流程吗...当执行到递归出口时,才得到第一项和第二项斐波拉契的值,并向上返回。 图二中蓝色箭头表示函数的调用过程,红色箭头表示递归函数在递归出口得到值后,不断的往上一层递归函数返回值。 ?...但在这个递归函数中,执行fib(5)会得到1吗?很明显不会,那这个1去哪了,不应该直接返回,然后结束函数吗? 很明显这个1并不是fib(5)的递归出口,这个1被返回给了上一层函数。...3 问题分析 这也解释了为什么很多人在使用递归函数时,return的值为None,但在return前print却有值的问题。...因为你只在函数最后一层return,这个return只会将值返回给函数上一层。如果需要将值返回调用,那么每一层函数都得有return并且被执行。

    1.1K30
    领券