首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

return 语句,但是在函数调用后,都能取到一个返回值。...它们的执行效果跟直接写 return 语句相比,是完全相同的: 这 4 个例子属于两种类型:一种没有写 return,但是都有隐藏的 return 返回值;一种写了 return,而且实际也有返回值。...不管有没有写 return,它们都会执行 return 的逻辑,而且默认的返回值就是 None。 那么,问题来了:Python 的函数为什么能默认返回 None 呢?它是如何实现的呢?...答案就在解释器中,当 CPython 解释器执行到函数的最后一个代码块时,若发现没有返回值,它就会主动地加上一个 Py_None 值返回(出自:compile.c): 也就是说,如果定义的函数没有返回值...那么,这就会引出新的问题:Python 为什么要求函数都要有返回值呢?为什么它不像某些语言那样,提供一个 void 关键字,支持定义无返回值的空函数呢?

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

千万别小看这些运算符背后的逻辑

注意:在javascript中,移位运算符只支持移动0~31位,如果移动的位数超过了31位,位数取模MOD 32。...var a = -1; a >> 2; // -1 // 如果用负数的补码形式进行算术右移,高位补1 如果你自己写几个右移运算表达式做试验,你就会产生一个疑惑,为什么有的正数在带符号右移后却变成了负数...在带符号二进制表示法中,正数负数首尾相连,形成一个环,在计算机可表示的范围内,溢出的那个数字在某种意义上能在另一个起点找到。 ?...因此移位后,原来的负数可能变成正数。可以简单记忆为“低位舍弃,高位补0”。...但是左移也要注意溢出的情况,比如: 1 << 31; // -2147483648 那么为什么javascript中却没有逻辑左移呢?

72630

「硬核JS」数字之美

我们可能注意到了,这样好像没办法表达负数 So,为了表示正与负,先辈们就发明了 「原码」,把左边第一位腾出来,存放符号,正数用 0 来表示,负用 1 来表示 上图就是正负数的 原码,你可能在疑惑为什么上面表里我只画到了数字...= 0.3 的原因,如果尾数不足 52 位则在后面补 0 即可 我们可能疑惑,为什么除了 0 之外的数字转二进制后首位都是 1,比如 0.0101 这种 0 < 值 < 1 的二进制小数首位不就是 0...,最小正数和最大负数 而最终的数字范围即 最小负数~最大负数 并上 最小正数~最大正数 从S、E、M即数符、阶码、尾数三个维度看,S 代表正负,阶码 E 的值远大于尾数 M 的个数,所以阶码 E 决定大小...为什么JavaScript有这种“骚”操作?[8] JS中如何理解浮点数?...为什么JavaScript有这种“骚”操作?: https://juejin.cn/post/6844903680362151950 [9]JS中如何理解浮点数?

5.4K20

小小的 float,藏着大大的学问

不知道你有没有想过,为什么计算机要用补码的方式来表示负数?在回答这个问题前,我们假设不用补码的方式来表示负数,而只是把最高位的符号标志位变为 1 表示负数,如下图过程: ?...到这里,我们就可以回答前面提到的「负数为什么要用补码方式来表示」的问题了。...这三个重要部分的意义如下: 符号位:表示数字是正数还是负数,为 0 表示正数,为 1 表示负数; 指数位:指定了小数点在数据中的位置,指数可以是负数,也可以是正数,指数位的长度越长则数值的表达范围就越大...我们在 JavaScript 里执行 0.1 + 0.2,你会得到下面这个结果: ?...为什么负数要用补码表示? 负数之所以用补码的方式来表示,主要是为了统一和正数的加减法操作一样,毕竟数字的加减法是很常用的一个操作,就不要搞特殊化,尽量以统一的方式来运算。 十进制小数怎么转成二进制?

1.7K20

「硬核JS」令你迷惑的位运算

估计大家久征沙场这些基础都忘完了,不然直接啃会有点迷 位运算 来回顾一下,我们都知道,平常我们用来计算的是十进制的数值 0~9 ,但是计算机是个机器,它只能识别二进制 根据国际 IEEE 754 标准,JavaScript...和 Infinity 在位运算中都会直接被当作 0 来处理 其实不止是 JS ,很多语言的位运算都是如此 有符号&无符号 穿插一个小知识点, ECMAScript 整数有两种类型,即有符号整数(允许用正数负数...)和无符号整数(只允许用正数) 在 ECMAScript 中,所有整数字面量默认都是有符号整数 有符号整数也就是上文所说,二进制左侧首位是符号位来表明该数字正负 而无符号整数就是没有符号位,没有了符号位置也就说它表达不了负数...1000 00 11,即十进制 -3 同上所述 十进制数字 1 的按位非即十进制 -2 十进制数字 0 的按位非即十进制 -1 上面说的都是正数,我们看一个负数的例子 十进制数字 -1 由于是负数,上文我们说过计算机中二进制存储负数为补码方式...,无符号右移会给空位都补 0 ,不管符号位是什么,这样的话正数的有符号右移和无符号右移结果都是一致的 负数就不一样了,当把一个负数进行无符号右移时也就是说把负数的二进制码包括符号为全部右移,向右被移出的位被丢弃

1.7K20

javaScript的Math数学对象 --用法大全

如果参数为空, Math.min返回Infinity, Math.max返回-Infinity。(补充:Infinity是javaScript能表达的最大整数,反之-Infinity是最小的。)...我们并不知道传如的到底是正数,还是负数。...为啥5还是被舍弃掉了;再看当小数点大于5的时候,尼玛的且返回了-2,不是应该进一位吗,怎么越变越小了啊?这不科学啊!我觉得应该扇javaScript原设计者Brendan Eich两耳光。...很显然这个负数的思维并不能按正数的思维逻辑这么来分析,但这时候有人提出了一个说法:“Math.round()”四舍五入法,总是取最近的值,当值位于中间时,总是取较大的整数值。...max - min) + min; } getRandomArbitrary(1.5, 6.5) // 2.4942810038223864 上面的函数所生成的随机化的范围是 0 - max之间,为什么

60250

这些 JS 中强大的操作符,总有几个你没听说过

返回最后一个表达式 expr3 的结果,其他的表达式只会进行求值。 3. 零合并操作符 ?? 零合并操作符 ??...位运算符 >> 与 >>> 有符号右移操作符 >> 将第一个操作数向右移动指定的位数,多余的位移到右边被丢弃,高位补其符号位,正数补 0,负数则补 1。...(0b111>>1).toString(2) // "11" (-0b111>>1).toString(2) // "-100" 感觉跟直觉不一样 正数的好理解,负数怎么理解呢,负数在计算机中存储是按照补码来存储的...双位运算符 ~~ 可以使用双位操作符来替代正数的 Math.floor( ),替代负数的 Math.ceil( )。双否定位操作符的优势在于它执行相同的操作运行速度更快。...这个特性给用户带来了很多便利,但有时候也带来了不必要的麻烦,如果右侧调用了一个原本没有返回值的函数,其返回值改变后,导致非预期的副作用。

51410

原码,反码,补码的深入理解与原理答案_原码反码补码例题详解

当然没错,但是前提是要先有负数的概念。这就为什么不得不引入一个该死的符号位。 而且从硬件的角度上看,只有正数负数才算减法。...两个正数相加和两个负数相加,其实都是一个加法问题,只是有无符号位罢了。而正数+负数才是真正的减法问题。 也就是说只要正数+负数不会出错,那么就没问题了。...而且我们可以通过下面的例子,也许能回答另一个问题,为什么负数的符号位是‘1’,而不是正数的符号位是‘1’。...8位机则会放在cy中,x86放在cf中(这个我们不作讨论) 这个时候,我们再想想在四位二进制数中,减去2,就相当于加上它的同余数14(至于它们为什么同余,还是建议看《计算机组成原理》) 但是减去2,...(七)为何这样求补码 然后我们再来看看为什么负数的补码的求法为什么是反码+1 因为负数的反码加上这个负数的绝对值正好等于1111,再加1,就是1000,也就是四位二进数的模 而负数的补码是它的绝对值的同余数

69410
领券