数字和算术运算
几乎每个你写的程序都会用到数字。购物车要计算总价。游戏要更新分数。脚本要统计某件事发生的次数。Python 提供的算术运算符跟纸笔数学一样,还额外多了几个从一开始就值得学的。
运算符
数学中的四个运算符(+、-、*、/)完全符合你的预期。Python 额外加了三个你会经常用到的:整除、求余和乘方。
price = 12.99
quantity = 3
print(price * quantity) # 38.97
print(price + 2) # 14.99
print(price - 1.00) # 11.99| 运算符 | 名称 | 例子 | 结果 |
|---|---|---|---|
+ | 加法 | 5 + 3 | 8 |
- | 减法 | 5 - 3 | 2 |
* | 乘法 | 5 * 3 | 15 |
/ | 除法 | 5 / 3 | 1.6666... |
// | 整除 | 5 // 3 | 1 |
% | 求余 | 5 % 3 | 2 |
** | 乘方 | 5 ** 3 | 125 |
+、-、*、/ 的表现就像纸笔数学。三个额外的值得早点学:// 除到整数,% 给你余数,** 乘方。我用 % 的次数比预期多得多。 除法:/ vs //
/ 总是给你精确的小数结果,即使答案是整数。// 丢弃小数部分,朝负无穷方向舍入。对正数来说就是去掉小数,但对负数来说会更远离零:
10 / 2 # 5.0 (总是float,即使整除)
10 / 3 # 3.3333333333333335
10 // 3 # 3
7 // 2 # 3
-7 // 2 # -4 (朝负无穷舍入,不是朝零)你大部分时候会对正数用 //。负数出现时记住这个行为。
/ 总是给回小数,即使整除:4 / 2 是 2.0。// 丢弃小数部分,但看负数:-7 // 2 是 -4,不是 -3,因为它朝负无穷舍入而不是截断。第一次做的时候被坑过。 求余运算符 %
% 给你整除后剩下的东西。如果 10 // 3 是 3(因为 3 进入 10 三次),那么 10 % 3 是 1(因为 3 × 3 = 9,10 - 9 = 1)。最常见的用法是检查一个数是奇数还是偶数。
10 % 3 # 1
10 % 2 # 0 (整除)
10 % 7 # 3
6 % 2 # 0 (偶数)
7 % 2 # 1 (奇数)% 是整除后的余数。10 % 3 是 1,因为 3 进入 10 三次,余 1。你最常见到它用作奇偶检查:n % 2 对偶数是 0,对奇数是 1。 乘方 **
** 把一个数乘以某个幂。用两个星号,不是 ^ 符号(在 Python 里意思完全不同):
2 ** 10 # 1024
3 ** 3 # 27
9 ** 0.5 # 3.0 (平方根:乘以 0.5)** 把一个数乘以某个幂,所以 2 ** 10 是 1024。分数幂给你根:9 ** 0.5 是 3.0。唯一的陷阱是符号,用 **,不是 ^,那在 Python 里做别的东西。 运算符优先级
Python 遵循标准数学顺序:乘方首先,然后乘法和除法,然后加法和减法。不确定时就用括号。它们让意图清晰,而且不花钱:
2 + 3 * 4 # 14,不是 20
2 ** 3 + 1 # 9,不是 512
10 - 4 / 2 # 8.0,不是 3.0
(2 + 3) * 4 # 20
10 / (2 + 3) # 2.0int 和 float 如何交互
Python 有个一致的规则:/ 总是返回小数,即使 4 / 2 也给 2.0。任何混合整数和小数的运算也给小数。当你需要整数时,用 // 或用 int() 转换。
4 / 2 # 2.0 (float,总是)
4 // 2 # 2 (int)
4 + 2 # 6 (int)
4 + 2.0 # 6.0 (float)
4 * 0.5 # 2.0 (float)/ 总是给小数,所以 4 / 2 是 2.0,不是 2。任何地方混合整数和小数,你得到小数。需要整数时,用 // 或包在 int() 里。 浮点数精度
有个陷阱几乎会让每个人某个时刻吃惊:
0.1 + 0.2 # 0.30000000000000004那个微小的误差不是 Python bug。计算机用二进制存储小数,有些值比如 0.1 不能精确表示。这类似于 1/3 不能用十进制精确写。对大多数日常计算不重要。显示钱时,round() 或 :.2f 格式说明符会保持输出整洁。
0.1 没有精确的二进制形式,所以 0.1 + 0.2 出来 0.30000000000000004。不是 Python bug,每种语言都这样。日常输出用 round() 或 :.2f 保持整洁。 可读的数字字面量
Python 让你在数字字面量里放下划线来让大数字更可读。Python 完全忽略它们;它们是给你看的:
population = 8_100_000_000
distance_km = 384_400
pi_approx = 3.141_592_6538_100_000_000 和 8100000000 是同一值。Python 完全忽略它们,它们是给你的眼睛,不是解释器。 有用的内置函数
abs()
abs() 返回绝对值:总是正的,不管输入的符号。当你关心一个数离零多远,不是哪个方向时用它。
abs(-5) # 5
abs(3.7) # 3.7
abs(-0.5) # 0.5abs() 剥掉符号,给回正的大小:abs(-5) 是 5,abs(3.7) 是 3.7。关心一个数离零多远,不是方向时用它。 round()
round() 默认舍入到最近的整数。传第二个参数来保持特定的小数位数:
round(3.7) # 4
round(3.2) # 3
round(3.14159, 2) # 3.14一件值得知道的事:round(2.5) 给 2,不是 3。Python 在值正好在两个选项之间时舍入到最近的偶数。
round(x) 去最近的整数,round(x, n) 保持 n 位小数。吃惊:一个值正好在中间舍入到最近的偶数,所以 round(2.5) 是 2,不是 3。 divmod()
divmod() 在一次调用里给你商和余数。它返回一对值,一个元组(在元组和集合章节讲),你可以一次赋给两个名字:
divmod(10, 3) # (3, 1): 商 3,余数 1
divmod(7, 2) # (3, 1)
divmod(9, 3) # (3, 0)
quotient, remainder = divmod(10, 3)
print(quotient) # 3
print(remainder) # 1divmod(a, b) 一起给回商和余数:divmod(10, 3) 是 (3, 1)。你可以一次解包两个用 quotient, remainder = divmod(10, 3)。 实际应用
一个小费计算器:
bill = 45.50
tip_rate = 0.18
tip = round(bill * tip_rate, 2)
total = round(bill + tip, 2)
print(f"Bill: ${bill}")
print(f"Tip: ${tip}")
print(f"Total: ${total}")round() 保持输出看起来像钱,而不是长串小数位。

