数字与算术
数字几乎出现在你写的每一个程序中。购物车计算总价。游戏更新分数。脚本统计某件事发生了多少次。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 |
除法:/ 与 //
/ 总是给你精确的十进制结果,即使答案是整数。// 只给你整数部分,舍去小数点后的所有内容。它不是四舍五入,而是直接截断:
10 / 2 # 5.0 (总是 float,即使能整除)
10 / 3 # 3.3333333333333335
10 // 3 # 3
7 // 2 # 3
-7 // 2 # -4 (向负无穷取整,而非向零取整)-7 // 2 的结果让人惊讶。你大多数情况下会对正数使用 //,这时不会出现这种情况。把它记在脑海里,当负数出现时备用。
取余运算符 %
% 给你整数除法之后剩下的数。如果 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 (奇数)幂运算 **
** 将一个数提升到某次幂。使用两个星号,而不是 ^ 符号(在 Python 中表示其他意思):
2 ** 10 # 1024
3 ** 3 # 27
9 ** 0.5 # 3.0 (平方根:提升到 0.5 次幂)运算符优先级
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)浮点精度
有一个几乎每个人在某个时刻都会遇到的陷阱:
0.1 + 0.2 # 0.30000000000000004这个微小的误差不是 Python 的 bug。计算机用二进制存储小数,而像 0.1 这样的某些值无法精确表示。这类似于 1/3 无法用十进制精确表示。对大多数日常计算来说这并不重要。对于显示金额,round() 或 :.2f 格式说明符可以让输出保持整洁。
可读的数字字面量
Python 允许你在数字字面量中放下划线,让大数更易阅读。Python 会完全忽略它们;它们只是给你看的:
population = 8_100_000_000
distance_km = 384_400
pi_approx = 3.141_592_653有用的内置函数
abs()
abs() 返回绝对值:无论输入的符号如何,结果总是正的。当你关心一个数离零有多远,而不是它在哪个方向时使用它。
abs(-5) # 5
abs(3.7) # 3.7
abs(-0.5) # 0.5round()
round() 默认四舍五入到最近的整数。传递第二个参数可保留特定的小数位数:
round(3.7) # 4
round(3.2) # 3
round(3.14159, 2) # 3.14值得了解的一件事:round(2.5) 给出 2,而不是 3。当值恰好处于两个选项中间时,Python 会舍入到最近的偶数。
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) # 1(3, 1) 是什么?
那是一个元组:一对一起返回的固定值。元组有它自己的章节。现在,把这两个值通过一次性赋值给两个名字来拆开,如上所示。
实践中
一个小费计算器:
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() 让输出看起来像金额,而不是一长串小数。

