逻辑运算符
Python 的逻辑运算符 and、or、not 用于组合和取反布尔条件。与其他语言不同,Python 的逻辑运算符不仅返回布尔值,还遵循独特的短路求值规则,返回决定结果的操作数本身。这一特性使它们在实际编程中远比单纯的"真/假判断"更加灵活。
not:逻辑非
not 是单目运算符,对操作数进行真值判断后取反。如果操作数为真,not 返回 False;如果为假,返回 True。
>>> not True
False
>>> not False
True
>>> not 0
True # 0 为假,取反为真
>>> not "hello"
False # 非空字符串为真,取反为假
>>> not None
True
not 的优先级低于比较运算符,因此 not a == b 被解析为 not (a == b),而非 (not a) == b。
>>> x = 5
>>> not x == 5
False # 等价于 not (x == 5)
>>> (not x) == 5
False # not x 得 False,False == 5 得 False
and:逻辑与
and 是双目运算符,当且仅当两个操作数都为真时返回真。但 Python 的 and 不直接返回 True 或 False,而是返回第一个假值操作数,或如果没有假值则返回最后一个操作数。
>>> True and False
False
>>> 3 and 5
5 # 两个都为真,返回最后一个
>>> 0 and 5
0 # 第一个为假,返回 0
>>> "hello" and "world"
'world' # 两个非空字符串都为真,返回最后一个
>>> [] and "world"
[] # 空列表为假,直接返回
这种返回值规则源于短路求值:如果第一个操作数为假,and 已经能确定整个表达式为假,于是直接返回第一个操作数,不再计算第二个。
>>> def side_effect():
... print("副作用执行了")
... return True
...
>>> False and side_effect()
False # side_effect 不会被执行
or:逻辑或
or 返回第一个真值操作数,或如果没有真值则返回最后一个操作数。只要第一个操作数为真,or 就立即返回它,不再检查第二个。
>>> True or False
True
>>> 3 or 5
3 # 第一个为真,直接返回
>>> 0 or 5
5 # 第一个为假,返回第二个
>>> "" or "default"
'default' # 空字符串为假,返回第二个
>>> None or 0 or [] or "fallback"
'fallback' # 一路找真值,最后返回最后一个
短路特性让 or 可以安全地处理可能为空的变量:
>>> user_input = ""
>>> value = user_input or "默认值"
>>> value
'默认值'
真值判断
Python 中以下值在布尔上下文中被视为 False(称为"假值"):
NoneFalse- 数字零:
0、0.0、0j - 空序列和空容器:
''、[]、()、{}、set()、range(0)
其余几乎所有对象都被视为 True("真值")。自定义类可以通过定义 __bool__() 或 __len__() 方法来控制自身的真值行为。
class EmptyContainer:
def __len__(self):
return 0
>>> container = EmptyContainer()
>>> bool(container)
False # __len__ 返回 0,被视为假
短路求值的实用模式
短路求值不仅是优化手段,更是编写安全代码的重要工具。
安全属性访问
# 先判断对象存在,再判断属性
if user and user.is_active:
print("用户活跃")
# 如果 user 为 None,user.is_active 不会执行,避免 AttributeError
默认值设置
# 获取配置值,不存在则使用默认值
port = config.get("port") or 8080
# 但要注意:如果合法值可能是 0,这种写法会错误地使用默认值
# 因为 0 是假值
对于可能为 0 的数值,应使用条件表达式:
port = config.get("port") if config.get("port") is not None else 8080
条件执行
# 仅在调试模式打印日志
debug and print(f"调试信息:{value}")
# 等价于
if debug:
print(f"调试信息:{value}")
组合使用的陷阱
and 和 or 组合时,优先级规则至关重要:not > and > or。
>>> True or False and False
True # 等价于 True or (False and False),不是 (True or False) and False
一个经典的陷阱是试图用 and/or 模拟条件表达式:
# 危险的写法(C 风格)
result = condition and value_if_true or value_if_false
# 当 value_if_true 为假值时会出错
>>> x = 0
>>> result = True and x or 100
>>> result
100 # 本意是 0,但 x 为假值导致返回 100
Python 2.5+ 提供了真正的条件表达式,应优先使用:
result = value_if_true if condition else value_if_false
返回值的应用
or 的"返回第一个真值"特性广泛用于设置默认值:
>>> def greet(name=None):
... name = name or "访客"
... print(f"你好,{name}")
...
>>> greet()
你好,访客
>>> greet("Alice")
你好,Alice
and 的"返回第一个假值"特性可用于参数校验:
>>> def divide(a, b):
... b and a / b or "除数不能为零"
...
>>> divide(10, 2)
5.0
>>> divide(10, 0)
'除数不能为零'
但这种技巧性代码可读性较差,正式项目中建议使用显式 if 语句。
逻辑运算符的短路求值和特殊返回值规则,是 Python"一切皆对象"哲学的直接体现。and 和 or 返回操作数本身而非强制转换为布尔值,这让它们可以自然地融入赋值、函数参数、序列操作等场景。理解真值判断规则和优先级,是写出既简洁又安全的条件代码的基础。