目录

第三章:运算符与表达式

本章目标

完成本章学习后,你将能够:

算术运算符

基本算术运算

a, b = 17, 5
 
print(a + b)   # 加法:22
print(a - b)   # 减法:12
print(a * b)   # 乘法:85
print(a / b)   # 除法:3.4(总是返回float)
print(a // b)  # 整除:3(向下取整)
print(a % b)   # 取模:2(余数)
print(a ** b)  # 幂运算:1419857

整除(//)的细节

# 正数
print(7 // 3)    # 2
 
# 负数(向负无穷取整)
print(-7 // 3)   # -3,不是 -2!
print(7 // -3)   # -3
 
# 与int()的区别
print(int(7 / 3))    # 2
print(int(-7 / 3))   # -2(向零取整)
print(-7 // 3)       # -3(向负无穷取整)

取模(%)的数学原理

# a % b 的结果总是与b同号(或与0同号)
print(7 % 3)     # 1
print(-7 % 3)    # 2(不是 -1!)
print(7 % -3)    # -2
print(-7 % -3)   # -1
 
# 应用:判断奇偶
def is_even(n):
    return n % 2 == 0
 
# 应用:循环索引
colors = ["red", "green", "blue"]
for i in range(10):
    print(colors[i % len(colors)])  # 循环使用颜色

比较运算符

a, b = 10, 20
 
print(a == b)   # 等于:False
print(a != b)   # 不等于:True
print(a > b)    # 大于:False
print(a < b)    # 小于:True
print(a >= b)   # 大于等于:False
print(a <= b)   # 小于等于:True

链式比较

Python支持数学风格的链式比较:

x = 15
 
# 传统写法
if x > 10 and x < 20:
    print("在范围内")
 
# Pythonic写法
if 10 < x < 20:
    print("在范围内")
 
# 更复杂的链式
a, b, c = 1, 2, 3
print(a < b < c)      # True
print(a < b > c)      # False(a<b为True,但b>c为False)
print(a == b == c)    # False

is 与 == 的区别

# == 比较值
print([1, 2, 3] == [1, 2, 3])  # True
 
# is 比较身份(内存地址)
print([1, 2, 3] is [1, 2, 3])  # False
 
a = [1, 2, 3]
b = a
print(a is b)  # True
 
# None检查应使用is
if x is None:
    print("x是None")

赋值运算符

基本赋值

x = 10          # 简单赋值
a = b = c = 0   # 链式赋值
x, y = 1, 2     # 解包赋值

复合赋值运算符

x = 10
x += 5   # x = x + 5,结果为15
x -= 3   # x = x - 3,结果为12
x *= 2   # x = x * 2,结果为24
x /= 4   # x = x / 4,结果为6.0
x //= 2  # x = x // 2,结果为3.0
x %= 2   # x = x % 2,结果为1.0
x **= 3  # x = x ** 3,结果为1.0

海象运算符(:=)Python 3.8+

walrus operator 允许在表达式中进行赋值:

# 传统写法
line = input()
while line != "quit":
    print(f"输入:{line}")
    line = input()
 
# 使用海象运算符
while (line := input()) != "quit":
    print(f"输入:{line}")
 
# 在列表推导中使用
values = [1, 2, 3, 4, 5]
results = [y for x in values if (y := x * 2) > 4]
print(results)  # [6, 8, 10]
 
# 在if语句中使用
if (n := len(data)) > 10:
    print(f"数据过长:{n}个元素")

位运算符

位运算符直接操作二进制位:

a, b = 5, 3  # 二进制:101 和 011
 
print(a & b)   # 按位与:1(001)
print(a | b)   # 按位或:7(111)
print(a ^ b)   # 按位异或:6(110)
print(~a)      # 按位取反:-6(二进制补码)
print(a << 2)  # 左移2位:20(10100)
print(a >> 1)  # 右移1位:2(10)

位运算应用

# 权限系统
READ = 4    # 100
WRITE = 2   # 010
EXECUTE = 1 # 001
 
# 设置权限
permission = READ | WRITE  # 110 = 6
 
# 检查权限
if permission & READ:
    print("有读权限")
 
if permission & EXECUTE:
    print("有执行权限")  # 不会输出
 
# 切换权限
permission ^= WRITE  # 异或切换写权限
 
# 判断奇偶(比%更快)
def is_odd(n):
    return n & 1 == 1
 
# 乘以/除以2的幂(比*/更快)
print(10 << 1)  # 20,等同于10 * 2
print(10 >> 1)  # 5,等同于10 // 2

逻辑运算符

and、or、not

print(True and False)   # False
print(True or False)    # True
print(not True)         # False

短路求值

Python的逻辑运算符使用短路求值

# and:如果第一个为False,返回第一个值;否则返回第二个值
print(0 and 5)      # 0
print(3 and 5)      # 5
print("" and "hi")  # ""
 
# or:如果第一个为True,返回第一个值;否则返回第二个值
print(3 or 5)       # 3
print(0 or 5)       # 5
print("" or "hi")   # "hi"
 
# 应用:默认值
name = user_input or "Anonymous"
 
# 应用:条件执行
def debug():
    print("调试信息")
    return True
 
is_debug = False
is_debug and debug()  # 不会调用debug()

真值测试

以下值在布尔上下文中为False

其他所有值都为True

成员运算符

in 和 not in

# 字符串
print("a" in "apple")      # True
print("z" not in "apple")  # True
 
# 列表
print(3 in [1, 2, 3])      # True
print(4 not in [1, 2, 3])  # True
 
# 字典(检查键)
print("name" in {"name": "Alice", "age": 25})  # True
print("Alice" in {"name": "Alice"})            # False(检查的是键)
 
# 元组
print((1, 2) in [(1, 2), (3, 4)])  # True

身份运算符

is 和 is not

a = [1, 2, 3]
b = [1, 2, 3]
c = a
 
print(a is b)      # False(不同对象)
print(a is c)      # True(同一对象)
print(a is not b)  # True
 
# 小整数缓存
x = 100
y = 100
print(x is y)      # True(缓存)
 
z = 1000
w = 1000
print(z is w)      # False(可能,取决于实现)
 
# None检查
if value is None:
    pass

运算符优先级

从高到低排序:

优先级 运算符 描述
1 () 括号
2

2. 权限系统:使用位运算实现文件权限管理系统 3. 闰年判断:使用条件表达式判断某年是否为闰年 4. 海象运算符练习:改写一段使用while循环的代码,使用海象运算符简化 5. 优先级测试:预测并验证以下表达式的结果:

  1. 2 3 2
  2. 10 - 4 + 2
  3. not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9

本章小结

本章我们学习了:

下一章:第四章:条件语句