2.2运算符与表达式

149 阅读3分钟

运算符与表达式

1. 基础运算符分类

1.1 算术运算符

# 基础运算
print(10 + 3)   # 加法 → 13
print(10 - 3)   # 减法 → 7
print(10 * 3)   # 乘法 → 30
print(10 / 3)   # 真除法 → 3.333...
print(10 // 3)  # 整除法 → 3
print(10 % 3)   # 取余 → 1
print(10 ** 3)  # 幂运算 → 1000

特殊案例

print(9 ** 0.5)  # 平方根 → 3.0
print(7 // -2)   # 负数整除 → -4(向下取整)

1.2 比较运算符

a, b = 5, 7
print(a == b)   # False
print(a != b)   # True
print(a > b)    # False
print(a <= b)   # True

# 字符串按字典序比较
print("apple" < "banana")  # True

1.3 逻辑运算符

短路特性示例

def check():
    print("执行检查")
    return True

False and check()  # 不执行check函数
True or check()    # 不执行check函数

1.4 成员运算符

colors = ["red", "green", "blue"]
print("yellow" in colors)     # False
print("green" not in colors)  # False

# 字符串子串检测
print("py" in "python")  # True

2. 高级运算符技巧

2.1 链式比较

x = 3
print(1 < x < 5)        # True
print(0 < x**2 < 25)    # True

# 等效于
print(1 < x and x < 5)  # True

注意陷阱

count = 0
def get_num():
    global count
    count += 1
    return count

# 链式比较触发两次函数调用
print(1 < get_num() < 3)  # 实际等价于 (1 < get_num()) and (get_num() < 3)
# 当count初始为0时:第一次返回1,第二次返回2 → (True) and (2 < 3) → True
# 但函数被调用两次,可能引发副作用

2.2 海象运算符(Python 3.8+)

在表达式中赋值

# 传统写法
n = len([1,2,3])
if n > 2:
    print(n)

# 使用海象运算符
if (n := len([1,2,3])) > 2:
    print(n)

# 循环中的应用
while (input_str := input("输入内容(q退出): ")) != "q":
    print(f"你输入了:{input_str}")

适用场景

  • 简化重复函数调用
  • 在推导式中复用计算结果
squares = [y for x in range(10) if (y := x**2) > 25]
print(squares)  # [36, 49, 64, 81]

3. 运算符优先级陷阱

3.1 优先级金字塔

graph TD
A[**] --> B[+x/-x]
B --> C[* / // %]
C --> D[+ -]
D --> E[< <= > >= == !=]
E --> F[not]
F --> G[and]
G --> H[or]

3.2 典型错误案例

案例1:混合算术与比较

print(5 + 10 * 2 == 25)  # 实际计算为5 + (10*2) = 25 → True
print(5 + 10 * 2 == 30)  # 新手可能误判 → False

案例2:逻辑运算顺序

flag1 = False
flag2 = True
print(flag1 == flag2 or flag1)  # → (False == True) → False → False or False → False
print(flag1 == (flag2 or flag1))  # → False == True → False

案例3:位运算符优先级

print(8 & 2 + 1)   # 等效于 8 & (2+1) → 0
print((8 & 2) + 1) # → 0 + 1 → 1

4. 最佳实践与调试技巧

4.1 避坑指南

  1. 括号显式优先
# 模糊表达式
result = x + y * z / 2

# 明确优先级
result = x + (y * z) / 2
  1. 分步计算验证
complex_expr = 3 ** 1 + 5 * 2 < 10 + 2 / 2
# 分解步骤:
# 步骤1:3**1 = 3
# 步骤2:5*2 = 10 → 3+10=13
# 步骤3:2/2=1 → 10+1=11
# 最终:13 < 11 → False

4.2 调试工具

AST查看器

import ast
print(ast.dump(ast.parse("1 < x < 5"), indent=2))
"""
Compare(
  left=Constant(value=1),
  ops=[Lt(), Lt()],
  comparators=[
    Name(id='x', ctx=Load()),
    Constant(value=5)])
"""

5. 运算符速查表

运算符类别运算符示例优先级
括号()最高
幂运算**
算术* / % //
加减+ -
比较== != < >较低
逻辑非not
逻辑与and最低
逻辑或or最低

下节预告:我们将深入探索Python的流程控制结构,通过构建一个智能温度预警系统来实践条件判断与循环的运用。