Skip to content

第 3 章 运算符与表达式

学习目标

  • 掌握算术、比较、逻辑、赋值四类运算符
  • 理解运算优先级,会用括号控制计算顺序
  • 能写出表示判断条件的表达式

3.1 算术运算符

Python 的算术运算符如下(/ 的结果总是浮点数):

运算符含义示例结果
+5 + 27
-5 - 23
*5 * 210
/5 / 22.5
//整除(向下取整)5 // 22
%取余5 % 21
**2 ** 38

三个细节值得注意。

第一,/// 的区别。 5 / 2 是普通的除法,结果是浮点数 2.5;5 // 2 是整除,向下取整,结果是 2。整除对负数也是向下取整:

>>> -7 // 2
-4
>>> -7 % 2
1

第二,*+ 对字符串也有效。 + 拼接字符串,* 重复字符串:

python
print("ab" + "cd")
print("ab" * 3)

输出:

abcd
ababab

第三,浮点数有精度问题。 试试看:

>>> 0.1 + 0.2
0.30000000000000004

原因:计算机用二进制表示小数,无法精确表示 0.1,所以结果是一个很接近但不等于 0.3 的数。因此判断浮点数相等不要直接用 ==,要判断它们的差是否足够小(第 5 章讲字符串时会再提到近似比较的用法)。

3.2 比较运算符

比较运算符用于比较两个值,结果永远是 bool 类型(TrueFalse):

运算符含义示例结果
==等于3 == 3True
!=不等于"a" != "b"True
>大于3 > 5False
<小于3 < 5True
>=大于等于5 >= 5True
<=小于等于4 <= 3False

字符串按字符顺序比较(字典序),大小写字母有固定顺序:

>>> "abc" < "abd"
True

比较可以链式书写,Python 会按数学惯例连续比较:

>>> 1 < 2 < 3
True

3.3 逻辑运算符

逻辑运算符用来组合多个条件,结果是 bool:

  • and:两边都为真,结果才为真。
  • or:至少一边为真,结果就为真。
  • not:取反,真变假、假变真。
表达式结果
True and FalseFalse
True or FalseTrue
not TrueFalse
python
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 赋值运算符

= 是赋值;把运算符与 = 组合,得到复合赋值运算符,等价于「先计算,再赋回」:

python
x = 5
x += 3        # 等价于 x = x + 3
print(x)

输出:

8

常见复合赋值:+=-=*=/=//=%=**=

3.5 优先级

当多个运算符出现在同一表达式里,按优先级决定先后:算术运算符 > 比较运算符 > not > and > or。同级从左到右。不确定时,用括号最稳妥——括号内的部分总是先算。

python
print(2 + 3 * 4)
print((2 + 3) * 4)

输出:

14
20

再看一个混合例子:

python
print(1 + 2 > 3 and 4 == 4)

计算过程:先算算术 1 + 23;再比较 3 > 3False;4 == 4True;最后 False and TrueFalse。输出:

False

动手实践

任务一:判断闰年。 闰年的规则:能被 4 整除,并且(不能被 100 整除,或者能被 400 整除)。

python
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

任务二:简单计算器。 读入两个数,输出加、减、乘、除、整除、取余、幂的结果。

python
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" + 1TypeError: 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(不报错)浮点数精度问题,不要用 == 判断浮点相等

章末练习

基础

  1. 写出下列表达式的结果:7 // 27 % 27 / 22 ** 3
  2. 写出下列表达式的结果:3 > 2 and 4 > 5not (1 < 2)
  3. 写出下列表达式的结果:(3 + 5) * 23 + 5 * 2

提高

  1. 写程序,读入一个整数,判断它能否同时被 3 和 5 整除,输出 TrueFalse
  2. 写程序,读入一个三位数(如 358),分别输出它的个位、十位、百位。提示:358 % 10 得个位 8,358 // 100 得百位 3

挑战

  1. 写程序,判断一个三位数是不是「水仙花数」:它的各位数字的立方和等于它本身。例如 153 = 1³ + 5³ + 3³。提示:% 的优先级低于 **,记得给各位数字加括号:(n % 10) ** 3

章末自测

每题选择一个最佳答案。本书不附答案:完成后交由老师或 AI 老师批改讲解。

  1. 5 / 2 的结果是?
    • A. 2
    • B. 2.5
    • C. 2.0
    • D. 报错
  2. 5 // 2 的结果是?
    • A. 2
    • B. 2.5
    • C. 3
    • D. 报错
  3. 7 % 3 的结果是?
    • A. 2
    • B. 1
    • C. 3
    • D. 0
  4. 2 ** 3 的结果是?
    • A. 6
    • B. 8
    • C. 9
    • D. 23
  5. "ab" * 3 的结果是?
    • A. ababab
    • B. ab3
    • C. 报错
    • D. ab*3
  6. 3 == 3 的结果是?
    • A. True
    • B. False
    • C. 0
    • D. 报错
  7. not (3 > 5) 的结果是?
    • A. True
    • B. False
    • C. 报错
    • D. None
  8. 0.1 + 0.2 == 0.3 的结果是?
    • A. True
    • B. False
    • C. 报错
    • D. 不确定
  9. 执行 x = 5; x //= 2 后,x 的值是?
    • A. 2
    • B. 2.5
    • C. 3
    • D. 报错
  10. 表达式 1 + 2 > 3 and 4 == 4 的结果是? A. True B. False C. 报错 D. 4