第 3 章 运算符与表达式
学习目标
- 掌握算术、比较、逻辑、赋值四类运算符
- 理解运算优先级,会用括号控制计算顺序
- 能写出表示判断条件的表达式
3.1 算术运算符
Python 的算术运算符如下(/ 的结果总是浮点数):
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
+ | 加 | 5 + 2 | 7 |
- | 减 | 5 - 2 | 3 |
* | 乘 | 5 * 2 | 10 |
/ | 除 | 5 / 2 | 2.5 |
// | 整除(向下取整) | 5 // 2 | 2 |
% | 取余 | 5 % 2 | 1 |
** | 幂 | 2 ** 3 | 8 |
三个细节值得注意。
第一,/ 与 // 的区别。 5 / 2 是普通的除法,结果是浮点数 2.5;5 // 2 是整除,向下取整,结果是 2。整除对负数也是向下取整:
>>> -7 // 2
-4
>>> -7 % 2
1第二,* 和 + 对字符串也有效。 + 拼接字符串,* 重复字符串:
print("ab" + "cd")
print("ab" * 3)输出:
abcd
ababab第三,浮点数有精度问题。 试试看:
>>> 0.1 + 0.2
0.30000000000000004原因:计算机用二进制表示小数,无法精确表示 0.1,所以结果是一个很接近但不等于 0.3 的数。因此判断浮点数相等不要直接用 ==,要判断它们的差是否足够小(第 5 章讲字符串时会再提到近似比较的用法)。
3.2 比较运算符
比较运算符用于比较两个值,结果永远是 bool 类型(True 或 False):
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
== | 等于 | 3 == 3 | True |
!= | 不等于 | "a" != "b" | True |
> | 大于 | 3 > 5 | False |
< | 小于 | 3 < 5 | True |
>= | 大于等于 | 5 >= 5 | True |
<= | 小于等于 | 4 <= 3 | False |
字符串按字符顺序比较(字典序),大小写字母有固定顺序:
>>> "abc" < "abd"
True比较可以链式书写,Python 会按数学惯例连续比较:
>>> 1 < 2 < 3
True3.3 逻辑运算符
逻辑运算符用来组合多个条件,结果是 bool:
and:两边都为真,结果才为真。or:至少一边为真,结果就为真。not:取反,真变假、假变真。
| 表达式 | 结果 |
|---|---|
True and False | False |
True or False | True |
not True | False |
print(3 > 2 and 4 > 5) # False:右边不成立
print(3 > 2 or 4 > 5) # True:左边成立即可
print(not 3 > 5) # True:3 > 5 是 False,取反为 True输出:
False
True
True优先级:not 高于 and,and 高于 or。
3.4 赋值运算符
= 是赋值;把运算符与 = 组合,得到复合赋值运算符,等价于「先计算,再赋回」:
x = 5
x += 3 # 等价于 x = x + 3
print(x)输出:
8常见复合赋值:+=、-=、*=、/=、//=、%=、**=。
3.5 优先级
当多个运算符出现在同一表达式里,按优先级决定先后:算术运算符 > 比较运算符 > not > and > or。同级从左到右。不确定时,用括号最稳妥——括号内的部分总是先算。
print(2 + 3 * 4)
print((2 + 3) * 4)输出:
14
20再看一个混合例子:
print(1 + 2 > 3 and 4 == 4)计算过程:先算算术 1 + 2 得 3;再比较 3 > 3 得 False;4 == 4 得 True;最后 False and True 得 False。输出:
False动手实践
任务一:判断闰年。 闰年的规则:能被 4 整除,并且(不能被 100 整除,或者能被 400 整除)。
year = int(input("请输入年份: "))
is_leap = year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
print(f"{year} 年是闰年: {is_leap}")运行示例:
请输入年份: 2024
2024 年是闰年: True自行验证:1900 年是 False,2000 年是 True。
任务二:简单计算器。 读入两个数,输出加、减、乘、除、整除、取余、幂的结果。
a = float(input("请输入第一个数: "))
b = float(input("请输入第二个数: "))
print(f"{a} + {b} = {a + b}")
print(f"{a} - {b} = {a - b}")
print(f"{a} * {b} = {a * b}")
print(f"{a} / {b} = {a / b}")
print(f"{a} // {b} = {a // b}")
print(f"{a} % {b} = {a % b}")
print(f"{a} ** {b} = {a ** b}")注意:除数为 0 会报 ZeroDivisionError: division by zero。如何让程序友好地处理这种情况,第 10 章「异常处理」会讲。
常见错误
| 错误写法 | 报错信息 | 原因 |
|---|---|---|
if x = 3: | SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? | 判断相等要用 ==,单个 = 是赋值 |
"a" + 1 | TypeError: can only concatenate str (not "int") to str | 字符串与数字不能直接用 + 拼接,先 str(1) 转换 |
print(1 / 0) | ZeroDivisionError: division by zero | 除数不能为 0 |
0.1 + 0.2 == 0.3 | 结果是 False(不报错) | 浮点数精度问题,不要用 == 判断浮点相等 |
章末练习
基础
- 写出下列表达式的结果:
7 // 2、7 % 2、7 / 2、2 ** 3。 - 写出下列表达式的结果:
3 > 2 and 4 > 5、not (1 < 2)。 - 写出下列表达式的结果:
(3 + 5) * 2、3 + 5 * 2。
提高
- 写程序,读入一个整数,判断它能否同时被 3 和 5 整除,输出
True或False。 - 写程序,读入一个三位数(如
358),分别输出它的个位、十位、百位。提示:358 % 10得个位8,358 // 100得百位3。
挑战
- 写程序,判断一个三位数是不是「水仙花数」:它的各位数字的立方和等于它本身。例如
153 = 1³ + 5³ + 3³。提示:%的优先级低于**,记得给各位数字加括号:(n % 10) ** 3。
章末自测
每题选择一个最佳答案。本书不附答案:完成后交由老师或 AI 老师批改讲解。
5 / 2的结果是?- A.
2 - B.
2.5 - C.
2.0 - D. 报错
- A.
5 // 2的结果是?- A.
2 - B.
2.5 - C.
3 - D. 报错
- A.
7 % 3的结果是?- A.
2 - B.
1 - C.
3 - D.
0
- A.
2 ** 3的结果是?- A.
6 - B.
8 - C.
9 - D.
23
- A.
"ab" * 3的结果是?- A.
ababab - B.
ab3 - C. 报错
- D.
ab*3
- A.
3 == 3的结果是?- A.
True - B.
False - C.
0 - D. 报错
- A.
not (3 > 5)的结果是?- A.
True - B.
False - C. 报错
- D.
None
- A.
0.1 + 0.2 == 0.3的结果是?- A.
True - B.
False - C. 报错
- D. 不确定
- A.
- 执行
x = 5; x //= 2后,x的值是?- A.
2 - B.
2.5 - C.
3 - D. 报错
- A.
- 表达式
1 + 2 > 3 and 4 == 4的结果是? A.TrueB.FalseC. 报错 D.4
