Kodewick
第 3 课,共 31 课目录

数字和计算

第 3 课,共 31 课 · 第 1 部分 · 基础 · 约 20 分钟

Python 是一个很好用的计算器。这一课用到两种数,int 和 float,以及算它们的各种运算符。下面每个结果都是在你的浏览器里现场算出来的。

基本运算符

运算符作用例子结果
+加7 + 310
-减7 - 34
*乘7 * 321
/除7 / 23.5
**乘方7 ** 249
main.py
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
main.py
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)

运算顺序

Python 的运算顺序和数学课上一样。表里越靠上越先算;同一行的从左往右,只有 ** 是从右往左:2 ** 3 ** 2 就是 2 ** 9。

顺序运算符
1( ) 括号
2**
3*、/、//、%
4+、-
main.py
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)

int 和 float 混着算

两种数可以随便混着算。只要有一边是 float,结果就是 float:

main.py
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:

main.py
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 += 5x = x + 5
x -= 5x = x - 5
x *= 5x = x * 5
x /= 5x = x / 5
main.py
1oil = 102oil -= 33oil += 54oil *= 25print(oil)
输出
24

好用的内置函数

main.py
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.:

main.py
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 箱。

练一练

写好代码,点检查。提示随便看,实在想不出来再看答案。

练习 1

几小时几分钟

把 minutes 换成几小时几分钟,显示下面这一行。

要显示
2 小时 5 分钟
exercise1.py
1minutes = 1252print(minutes)
输出
点「运行」或按 Ctrl+Enter
练习 2

整齐的合计

三盏灯每盏 1.10 元,合计显示出来带着一点浮点误差。改成正好两位小数。

要显示
合计:3.30
exercise2.py
1price = 1.102count = 33print(f"合计:{price * count}")
输出
点「运行」或按 Ctrl+Enter
练习 3

改对平均分

这行本来要显示三个分数的平均分,可结果不对。改好它。

要显示
8.0
exercise3.py
1a = 72b = 83c = 94print(a + b + c / 3)
输出
点「运行」或按 Ctrl+Enter

这一课学会了

  • + - * / 和数学里一样;** 是乘方。
  • / 的结果总是 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。