Menu

Python 数字与布尔值:int、float、bool 与算术运算

Python 如何处理整数、浮点数和布尔值:算术运算、类型转换,以及容易让人踩坑的边界情况。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

两种数字,一种真值

你日常会用到的数字类型是 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。

在实际使用中,这意味着两件事:

  1. 不要用 == 比较浮点数。如果你需要“足够接近”,请使用 math.isclose(a, b),或者检查 abs(a - b) < some_tolerance 是否成立。
  2. 涉及金额时,请使用 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 会把很多值当作“偏真”或“偏假”。假值有:

  • False
  • 0、0.0
  • None
  • 空容器:""、[]、{}、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: 可以读作“如果列表里有东西”。

Coddy 编程语言插图

和 Coddy 一起学编程

开始