跳到主要内容

Python 中 any() 和 all() 方法有什么作用?

定义​

  • any(iterable):可迭代对象中至少有一个元素为真,返回 True
  • all(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()
含义存在一个为真全部为真
空序列FalseTrue
短路时机遇到第一个 True遇到第一个 False
对应逻辑逻辑或(∃)逻辑与(∀)
  • 配合生成器表达式使用,充分利用短路特性
  • 注意 all([]) 返回 True 的空真边界情况