两种数字,一种真值
你日常会用到的数字类型是 int 和 float,再加上表示真假的 bool。对普通的 Python 程序来说,它们足以应付几乎所有的算术和逻辑运算。
Python 有时把布尔值看作整数的子类型:True 实际上就是 1,False 实际上就是 0。这在后面会带来一些实用的技巧。
整数运算
Python 中的整数永远不会溢出。这听起来无关紧要,直到你写出第一个阶乘函数,才会意识到在大多数其他语言里,结果早就悄悄变成负数了。
不管结果多大,两者都会给出精确的答案。唯一的上限是内存。
算术运算符和你想的一样,另外还多了几个:
这个列表中有三点值得记住:
- 在 Python 3 中,
/总是返回浮点数,即使两边都是整数。10 / 2得到的是5.0,而不是5。如果你想要整数,请使用//。 //向负无穷方向取整,所以-7 // 2是-4,而不是-3。有点特别,但规则是一致的。%返回余数,用来判断“这个数是不是偶数”(n % 2 == 0)或者在固定范围内循环都很方便。
浮点数和它著名的陷阱
浮点数天生就不完美。它们以二进制存储,而二进制无法精确表示大多数十进制小数。教科书式的例子:
第一行打印 0.30000000000000004。第二行打印 False。所有遵循 IEEE 754 标准的语言(Python、JavaScript、Java、C)都是这样。这不是 Python 的 bug。
在实际使用中,这意味着两件事:
- 不要用
==比较浮点数。如果你需要“足够接近”,请使用math.isclose(a, b),或者检查abs(a - b) < some_tolerance是否成立。 - 涉及金额时,请使用
decimal.Decimal。标准库的decimal模块提供精确的十进制运算,不会出现0.1 + 0.2这样的意外。它比 float 慢,所以不是默认选项,但处理货币时它才是正确的选择。
数字类型之间的转换
Python 不会悄悄地把整数转换成字符串,也不会把字符串转换成数字。你需要显式地进行转换:
无效的转换会抛出 ValueError:
>>> int("hello")
ValueError: invalid literal for int() with base 10: 'hello'
错误信息直截了当,很容易据此处理。清理输入,或者捕获这个异常。
深入一点看布尔值
True 和 False 是两个布尔值,拼写必须完全一样,首字母大写。大多数比较都会产生其中之一:
布尔运算符是 and、or 和 not,用英文单词而不是符号来写:
有一个值得了解的细节:and 和 or 不一定返回 True 或 False,它们返回的是决定表达式结果的那个值。0 or "fallback" 返回 "fallback";5 and 10 返回 10。这让你可以写出 name = user_input or "anonymous" 这样简短的默认值,而当某个布尔判断给出了意料之外的类型时,理解这一点也很有帮助。
真值与假值
当你在 if 或 while 这样的布尔上下文中使用值时,Python 会把很多值当作“偏真”或“偏假”。假值有:
False0、0.0None- 空容器:
""、[]、{}、set()、()
其他一切都是真值。这让你能写出更自然的判断:
把 if name: 读作“如果 name 里有内容”。这比 if name != "": 清爽得多。只是对数字要小心:if count: 会把 0 当作“跳过”,这通常是你想要的,但并不总是。如果零是合法的值,请改用 if count is not None:。
布尔值的算术运算
因为布尔值本身就是整数,所以你可以对它们做算术运算:
这个技巧用得很多,值得记下来。如果你想统计列表中有多少元素通过了某个测试,就对一个返回布尔值的生成器求和:
实用要点
- 整数永远不会溢出,放心使用。
/返回浮点数;想要整数除法时用//。- 不要用
==比较浮点数;请带容差比较,涉及金额时使用Decimal。 - 真值让条件读起来更自然,只要记住
0和空字符串是假值。
下一步:输入与打印,这两个工具能让你的脚本从沉默的程序变成可以对话的程序。
常见问题
Python 中 int 和 float 有什么区别?
int 是没有小数点的整数;float 是带小数点的数。Python 的整数可以任意大,不会溢出。浮点数遵循标准的 IEEE 754 规则,这意味着在做十进制运算时可能会损失一点点精度。
为什么在 Python 中 0.1 + 0.2 不等于 0.3?
因为二进制浮点数无法精确表示大多数十进制小数。0.1 + 0.2 的结果是 0.30000000000000004。这不是 Python 的 bug,所有使用 IEEE 754 浮点数的语言都是这样。如果需要精确的十进制运算,请使用 decimal 模块。
Python 中的真值和假值是什么?
在布尔上下文中,Python 会把很多值当作真或假,即使它们并不是字面意义上的 True 或 False。零、空字符串、空列表、空字典和 None 是假值;大多数其他值是真值。if my_list: 可以读作“如果列表里有东西”。