数字和算术

几乎你写的每一个程序都会用到数字。购物车计算价格。游戏更新分数。脚本计数某件事发生的次数。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() 保持输出看起来像金钱,而不是长长的小数位。

