数字和计算
Python 是一个很好用的计算器。这一课用到两种数,int 和 float,以及算它们的各种运算符。下面每个结果都是在你的浏览器里现场算出来的。
基本运算符
| 运算符 | 作用 | 例子 | 结果 |
|---|---|---|---|
+ | 加 | 7 + 3 | 10 |
- | 减 | 7 - 3 | 4 |
* | 乘 | 7 * 3 | 21 |
/ | 除 | 7 / 2 | 3.5 |
** | 乘方 | 7 ** 2 | 49 |
1print(7 + 3)2print(7 - 3)3print(7 * 3)4print(7 / 3)5print(2 ** 10)
10 4 21 2.3333333333333335 1024
运算符两边的空格可写可不写,写了更好读。乘号是 *,不是 x;** 表示「几次方」。
除法的三种算法
/ 的结果总是 float,就算正好除尽也一样。另外两个运算符把除法拆成「整的部分」和「剩下的部分」:
| 运算符 | 名字 | 17 和 5 |
|---|---|---|
/ | 除 | 3.4 |
// | 整除:能整着分几次 | 3 |
% | 取余:分完还剩多少 | 2 |
1print(6 / 3)2lamps = 173per_street = 54print(f"装满的街:{lamps // per_street}")5print(f"剩下的灯:{lamps % per_street}")6print(10 % 2, 11 % 2)
2.0 装满的街:3 剩下的灯:2 0 1
% 比你想的更常用:% 2 得 0 就是偶数;% 60 能把一共多少分钟变成「几点过几分」里的「几分」。
这段代码显示什么?
1print(20 // 6, 20 % 6) 20 里能整着放下 3 个 6(一共 18),还剩 2。// 得 3,% 得 2。
运算顺序
Python 的运算顺序和数学课上一样。表里越靠上越先算;同一行的从左往右,只有 ** 是从右往左:2 ** 3 ** 2 就是 2 ** 9。
| 顺序 | 运算符 |
|---|---|
| 1 | ( ) 括号 |
| 2 | ** |
| 3 | *、/、//、% |
| 4 | +、- |
1print(2 + 3 * 4)2print((2 + 3) * 4)3print(2 * 3 ** 2)4print(-2 ** 2)
14 20 18 -4
最后一个常让人意外:** 比负号先算,所以它是 -(2 ** 2)。拿不准就加括号,不费事,意思也清楚。
这段代码显示什么?
1print(10 - 4 / 2) 先算 /:4 / 2 是 2.0。再算 10 - 2.0,得 8.0。是小数,因为 / 的结果总是 float。
int 和 float 混着算
两种数可以随便混着算。只要有一边是 float,结果就是 float:
1print(3 + 2.0)2print(type(3 + 2.0))3print(0.1 + 0.2)4print(1.1 * 3)
5.0 <class 'float'> 0.30000000000000004 3.3000000000000003
后两个不是 Python 出错了。电脑用二进制存小数,像 0.1 这样的大多数小数都存不准,就像 1/3 写成小数永远写不完。误差非常小,可显示出来就看得见。整数(int)永远是准的。
取整和保留小数
round(x) 取整;round(x, 2) 保留两位小数。如果只想显示成两位小数,在 f-string 里的值后面加 :.2f:
1share = 2 / 32print(share)3print(round(share, 2))4print(round(share))5print(f"每人分到 {share:.2f}")6print(round(2.5), round(3.5))
0.6666666666666666 0.67 1 每人分到 0.67 2 4
小技巧: round() 遇到正好一半时,取离它最近的偶数,所以 round(2.5) 是 2。这样大量数字一起取整时更公平。算钱的话,一般保留原来的值,显示时再用 :.2f。
在原来的基础上改
给变量加一个数太常见了,所以有简写。oil += 5 就是 oil = oil + 5:
| 简写 | 意思 |
|---|---|
x += 5 | x = x + 5 |
x -= 5 | x = x - 5 |
x *= 5 | x = x * 5 |
x /= 5 | x = x / 5 |
1oil = 102oil -= 33oil += 54oil *= 25print(oil)
24
好用的内置函数
1print(abs(-7))2print(min(4, 9, 2))3print(max(4, 9, 2))4print(sum([4, 9, 2]))
7 2 9 15
abs 去掉负号;min、max 从几个值里挑出最小和最大的。sum 把一列数加起来;方括号是「列表」,第 9 课会细讲。
math 模块
更多数学功能在 math 模块里。先在最上面写一次 import math,之后每个名字前加 math.:
1import math2print(math.sqrt(16))3print(math.pi)4print(math.floor(3.7), math.ceil(3.2))
4.0 3.141592653589793 3 4
| 名字 | 得到 |
|---|---|
math.sqrt(x) | 平方根(float) |
math.pi | 圆周率 |
math.floor(x) | 往下取整 |
math.ceil(x) | 往上取整 |
要算「够不够」的时候用 math.ceil:17 盏灯,一箱装 5 盏,要 math.ceil(17 / 5),也就是 4 箱。
练一练
写好代码,点检查。提示随便看,实在想不出来再看答案。
几小时几分钟
✓把 minutes 换成几小时几分钟,显示下面这一行。
2 小时 5 分钟
1minutes = 1252print(minutes)
整齐的合计
✓三盏灯每盏 1.10 元,合计显示出来带着一点浮点误差。改成正好两位小数。
合计:3.30
1price = 1.102count = 33print(f"合计:{price * count}")
改对平均分
✓这行本来要显示三个分数的平均分,可结果不对。改好它。
8.0
1a = 72b = 83c = 94print(a + b + c / 3)
这一课学会了
+ - * /和数学里一样;**是乘方。/的结果总是 float;//得整的部分,%得余数。- 先算
**,再算* / // %,最后+ -;括号最优先。 int和float混着算得float;小数可能有一点点误差。round(x, 2)保留两位小数;f"{x:.2f}"显示两位小数。x += 1是x = x + 1的简写。abs、min、max、sum是内置的;import math后能用sqrt、pi、floor、ceil。