查看全课大纲(第 7 / 51 节)
  1. 1.Python 是什么?为什么值得学?
  2. 2.如何为 Python 编程准备一个“全家桶”环境?
  3. 3.Python 有哪几种执行方法?
  4. 4.行与缩进到底有什么用?
  5. 5.注释有什么用,怎么写?
  6. 6.变量:如何给数据起个好名字?
  7. 7.运算符的优先级和常见坑点是什么?
  8. 8.Python 中,数字和布尔值究竟有哪几种?
  9. 9.输入函数 `input()` 和文件读取 `open()` 怎么用?
  10. 10.如何将程序的结果展示给用户或保存下来?
  11. 11.CSV 文件怎么读怎么写才方便?
  12. 12.列表是什么,如何创建和访问它?
  13. 13.列表的修改操作,有哪些方法?
  14. 14.列表切片为什么能取到部分元素?排序和查找又该怎么用?
  15. 15.判断语句:如何让程序根据条件做不同的事?
  16. 16.for 循环如何遍历序列中的元素?
  17. 17.while 循环什么时候才会停?
  18. 18.while 循环的结束条件,你写对了吗?
  19. 19.循环中途想提前结束,怎么办?
  20. 20.`break` 和 `continue` 到底有什么区别?
  21. 21.列表推导式如何让代码更简洁高效?
  22. 22.字符串怎么定义、拼接和操作?
  23. 23.元组:为什么定义单个元素时要加逗号?
  24. 24.集合(set)怎么用?如何快速去重和做集合运算?
  25. 25.字典是什么,为什么比列表更方便?
  26. 26.字典的增删改查与遍历,如何避免 KeyError?
  27. 27.函数里的变量,为什么有的能用有的不能用?
  28. 28.在函数内部修改全局变量,为什么有时不生效?
  29. 29.函数里能修改全局变量吗?返回值怎么用?
  30. 30.匿名函数:如何用 lambda 快速定义简单函数?
  31. 31.面向对象编程是什么,为什么需要它?
  32. 32.类中的方法和属性到底怎么定义和使用?
  33. 33.如何控制对对象内部属性和方法的访问?
  34. 34.异常发生时,程序会怎样继续执行?
  35. 35.如何组织代码:包和模块
  36. 36.`if __name__ == '__main__'` 到底有什么用?
  37. 37.如何用 IDE 的 Debug 功能排查程序错误?
  38. 38.Matplotlib 绘图的第一步该做什么?
  39. 39.Figure 是什么,如何设置图形尺寸?
  40. 40.如何自定义 Matplotlib 的坐标轴?
  41. 41.如何为图表添加图例,让不同曲线一目了然?
  42. 42.饼图怎么画才能直观展示数据占比?
  43. 43.如何用 Matplotlib 绘制散点图?
  44. 44.柱状图怎么画?
  45. 45.如何使用 Matplotlib 绘制等高线图?
  46. 46.如何在 Matplotlib 中绘制子图?
  47. 47.zip 函数如何把多个列表“打包”在一起?
  48. 48.如何给可迭代对象加上索引?
  49. 49.random 模块如何生成随机数?
  50. 50.math 模块怎么用?
  51. 51.Counter 如何快速统计元素出现次数?

运算符的优先级和常见坑点是什么?

约 12 分钟

小象实战讲义 · Python 编程从入门到实践

在前面的课程中,我们已经学会了如何使用变量来存储数据。本节我们将学习如何通过运算符对这些数据进行计算和比较。运算符是连接数据、构成表达式的基本工具,理解它们的类型、用法和优先级,是编写正确逻辑代码的前提。本节是构建复杂表达式的基础,后续的控制流(如 if、while)将大量依赖本节知识。

💡 核心导读

  • 算术运算符:执行基础的数学运算,包括加减乘除、取整、取余和幂运算。
  • 比较运算符:比较两个值的关系,结果为布尔值(True或False),是条件判断的核心。
  • 赋值运算符:将值赋给变量,复合赋值运算符(如+=)能简化代码。
  • 逻辑运算符:连接多个布尔条件,实现“与”、“或”、“非”的逻辑判断。
  • 优先级规则:不同运算符混合时,计算顺序由优先级决定,括号可以明确指定计算顺序。

算术运算符:基础数学计算

算术运算符用于执行基本的数学运算。

# 基础加减乘
a = 2 + 3
b = 5 - 2
c = 3 * 4
print(a)
print(b)
print(c)

# 除法:单斜杠 / 得到浮点数结果(真除法)
result_float = 4 / 3
print(result_float)

# 取整除法:双斜杠 // 只取商的整数部分,不四舍五入
result_floor = 4 // 3
print(result_floor)
result_floor2 = 5 // 3
print(result_floor2)

# 取模(求余数):百分号 %
remainder = 5 % 3
print(remainder)

# 幂运算:双星号 **
power = 4 ** 3
print(power)
5
3
12
1.3333333333333333
1
1
2
64

是什么:/进行真除法,结果总是浮点数;//进行取整除法,只取商的整数部分,不做四舍五入;%求余数;**计算幂次。

常见坑:// 不是四舍五入,而是丢弃小数部分。例如 5 // 3 得到 1(不是 2),因为 5 / 3 的整数部分是 1。需要整数商时用 //,需要小数结果时用 /。

比较与逻辑运算符:做出判断

比较运算符用于比较两个值,返回布尔值(True或False)。逻辑运算符用于连接多个布尔条件。

# 比较运算符
print(2 > 3)   # 大于
print(3 > 2)   # 大于
print(4 < 3)   # 小于
print(2 >= 2)  # 大于等于
print(3 <= 2)  # 小于等于
print(3 == 3)  # 等于
print(3 != 2)  # 不等于

# 逻辑运算符:and, or, not
x = (2 > 1)  # True
y = (3 < 2)  # False

print(x and y)  # 与:两者都为True才为True
print(x or y)   # 或:至少一个为True就为True
print(not x)    # 非:取反
print(not y)

# 逻辑运算符连接复杂条件
age = 20
score = 85
print((age >= 18) and (score >= 60))  # 成年且及格
print((age < 18) or (score < 60))     # 未成年或不及格
False
True
False
True
False
True
True
False
True
False
True
True
False

是什么:比较运算符包括 >、<、>=、<=、==(等于)、!=(不等于)。它们构成了条件判断的基础。

怎么用:and 表示“并且”,or 表示“或者”,not 表示“非”。它们常用于 if 语句的条件组合。

常见坑:and 和 or 的优先级不同,and 高于 or。不要凭感觉从左到右计算,复杂表达式应加括号。

赋值与复合赋值运算符

赋值运算符 = 将右侧的值赋给左侧的变量。复合赋值运算符将运算与赋值合并。

a = 5
print(a)

# 复合赋值运算符
a += 2  # 等价于 a = a + 2
print(a)

a -= 1  # 等价于 a = a - 1
print(a)

a *= 3  # 等价于 a = a * 3
print(a)

a //= 4 # 等价于 a = a // 4
print(a)
5
7
6
18
4

是什么:+=、-=、*=、/=、//=、%=、**= 等都是复合赋值运算符。

怎么用:变量 运算符= 表达式 等价于 变量 = 变量 运算符 (表达式)。它使代码更简洁。

运算符优先级:谁先计算?

当多种运算符出现在同一个表达式中时,Python 按照优先级顺序计算。优先级高的先算。

优先级规则(从高到低):

  1. ** (幂)
  2. *, /, //, % (乘、除、取整、取余)
  3. +, - (加、减)
  4. >, <, >=, <=, ==, != (比较运算符)
  5. not (逻辑非)
  6. and (逻辑与)
  7. or (逻辑或)

同一级别内的优先级:逻辑运算符内部,and 的优先级高于 or,下面用代码验证。

# 优先级:算术运算符 > 比较运算符 > 逻辑运算符
# 2+3 和 1+2 先计算,然后比较 5 > 3
result = 2 + 3 > 1 + 2
print(result)

# 使用括号可以改变优先级,让意图更清晰
result_clear = (2 + 3) > (1 + 2)
print(result_clear)

# 演示 and 优先级高于 or
# 表达式:True or False and False
# 如果 or 先算:(True or False) and False -> True and False -> False
# 实际 and 先算:True or (False and False) -> True or False -> True
result = True or False and False
print(result)

# 使用括号明确意图总是好习惯
result_with_parentheses = (True or False) and False
print("加括号明确or先算:", result_with_parentheses)
True
True
True
加括号明确or先算: False

重要建议:对于复杂的逻辑表达式,不要依赖记忆优先级,而是主动使用小括号 () 来明确指定计算顺序。这能避免错误,并大大提高代码的可读性。

📝 动手练一练

  1. 计算与判断:假设商品单价为 25.5 元,购买数量为 3。计算总价(单价*数量)。如果总价大于 70 元,则享受 9 折优惠,重新计算折后总价(使用复合赋值运算符)。最后打印折后总价,并判断折后总价是否低于 80 元。
👉 点击查看参考答案

思路:先计算原总价,用 if 判断是否大于70,如果大于则用 *= 乘以0.9计算折后价。最后用比较运算符判断并打印结果。

price = 25.5
quantity = 3
total = price * quantity

if total > 70:
    total *= 0.9  # 打九折

print("折后总价为:{:.2f} 元".format(total))  # 格式化保留两位小数
is_less_than_80 = total < 80
print("折后总价低于80元吗?{}".format(is_less_than_80))
折后总价为:68.85 元
折后总价低于80元吗?True

常见错误

错误写法现象或报错原因正确写法
5 // 3 期望得到 2实际得到 1取整除法 // 只取整数部分,不四舍五入;5 / 3 的整数部分是 1。需要整数商时用 //,需要小数结果时用 /。
1/2 期望得到 0得到 0.5Python 3 中 / 是真除法,总是返回浮点数结果。取整请使用 1 // 2。

小结

  1. 算术运算符 +, -, *, /, //, %, ** 用于数值计算,注意 /(真除)与 //(取整除)的区别。
  2. 比较运算符 >, <, >=, <=, ==, != 用于比较,结果是布尔值 True 或 False。
  3. 逻辑运算符 and, or, not 用于连接布尔条件,构建复杂的判断逻辑。
  4. 复合赋值运算符(如 +=)是“运算+赋值”的简写形式,能使代码更简洁。
  5. 运算符有明确的优先级:算术 > 比较 > 逻辑(not > and > or)。编写复杂表达式时,使用括号 () 来明确计算顺序是最佳实践,能避免错误并提升可读性。

📋 行动清单

  • 在 Python 交互环境中,亲自输入本节所有示例代码,观察输出结果,确保理解。
  • 尝试写出一个表达式,包含至少两种算术运算符、一个比较运算符和一个逻辑运算符,并用括号改变其运算顺序,验证结果。
  • 回顾“常见错误”表格,确保自己不会犯这些典型错误。

—— 小象教研组