Python 中 any() 和 all() 方法有什么作用?
定义
any(iterable):可迭代对象中至少有一个元素为真,返回Trueall(iterable):可迭代对象中所有元素为真,返回True
any([False, False, True]) # True
any([False, False, False]) # False
all([True, True, True]) # True
all([True, False, True]) # False
真值判断规则
Python 中以下值被视为假(Falsy):
False、0、0.0、""、[]、()、{}、set()、None
其余均为真(Truthy)。
边界情况:空可迭代对象
any([]) # False ← 没有任何元素为真
all([]) # True ← 没有任何元素为假(空集合的全称命题,逻辑上为真)
all([]) 返回 True 是数学上的"空真"(vacuous truth),需特别注意。
短路求值
两个函数都支持短路求值,找到结果即停止迭代:
def check(x):
print(f"检查 {x}")
return x > 0
# any 找到第一个 True 就停止
any(check(x) for x in [1, 2, 3])
# 检查 1 ← 第一个就为 True,后续不再检查
# all 找到第一个 False 就停止
all(check(x) for x in [-1, 2, 3])
# 检查 -1 ← 第一个就为 False,后续不再检查
因此配合生成器表达式使用,可避免不必要的计算。
常见用法
检查列表中是否存在满足条件的元素
nums = [3, -1, 7, -5, 2]
# 是否有负数
print(any(x < 0 for x in nums)) # True
# 是否全为正数
print(all(x > 0 for x in nums)) # False
字符串验证
password = "Hello123"
has_upper = any(c.isupper() for c in password) # True
has_digit = any(c.isdigit() for c in password) # True
all_alnum = all(c.isalnum() for c in password) # True
print(has_upper and has_digit and all_alnum) # True
权限检查
user_roles = ["viewer", "editor"]
required_roles = ["admin", "editor"]
# 用户是否拥有任一所需权限
print(any(role in user_roles for role in required_roles)) # True
# 用户是否拥有所有所需权限
print(all(role in user_roles for role in required_roles)) # False
矩阵行/列检查
matrix = [
[1, 2, 3],
[4, 0, 6],
[7, 8, 9],
]
# 是否存在全零的行
print(any(all(x == 0 for x in row) for row in matrix)) # False
# 是否所有行都包含正数
print(all(any(x > 0 for x in row) for row in matrix)) # True
与 filter / 列表推导式对比
nums = [1, -2, 3, -4]
# 判断是否有负数
any(x < 0 for x in nums) # ✅ 推荐:短路,内存友好
bool([x for x in nums if x < 0]) # ❌ 构建完整列表后再判断
len(list(filter(lambda x: x < 0, nums))) > 0 # ❌ 冗长
手动实现
理解其等价逻辑:
def my_any(iterable):
for x in iterable:
if x:
return True
return False
def my_all(iterable):
for x in iterable:
if not x:
return False
return True
总结
any() | all() | |
|---|---|---|
| 含义 | 存在一个为真 | 全部为真 |
| 空序列 | False | True |
| 短路时机 | 遇到第一个 True | 遇到第一个 False |
| 对应逻辑 | 逻辑或(∃) | 逻辑与(∀) |
- 配合生成器表达式使用,充分利用短路特性
- 注意
all([])返回True的空真边界情况