Python · 3 分钟阅读
`any()` 函数
目录
any() 接收一个 可迭代对象,只要其中有 至少一个 元素为 truthy,就返回
True;全部都是 falsy 时返回 False。它常常和 all()、生成器表达式一起用,
让代码既紧凑又高效。
1. 语法
any(iterable)
- 空可迭代对象返回
False。 - 一旦遇到 truthy 元素就短路,不再继续迭代。
2. 基础示例
print(any([False, 0, "", None])) # False
print(any([False, 0, "hi", None])) # True("hi" 是 truthy)
print(any([])) # False(空)
print(any(i > 5 for i in [1, 2, 3]))# False
print(any(i > 5 for i in [1, 6, 3]))# True
3. 与生成器一起:原题回顾
if any(s[i] != char for s in strs):
return strs[0][:i]
逐项拆解:
(s[i] != char for s in strs):生成器,依次产生每个串在i处的字符
是否等于char。any(...):只要存在“任一不等” → 返回True。- 命中
if时,已知i不是公共前缀了,所以return strs[0][:i]
返回前面已经一致的部分——即最长公共前缀。
用生成器是“懒”的:如果第一个就
True,后面的不计算,比
[ ... for ... ]省内存。
4. 常见用法
4.1 验证列表里是否含特定值
roles = {"admin", "editor", "viewer"}
if any(r in roles for r in user.roles):
...
4.2 检查文件 / 路径是否存在
from pathlib import Path
candidates = [Path("/usr/bin/python"), Path("/usr/local/bin/python")]
if any(p.exists() for p in candidates):
...
4.3 检查字符串中是否包含敏感词
banned = ["foo", "bar", "baz"]
text = "hello baz world"
contains_banned = any(w in text for w in banned) # True
4.4 多个文件只要有一个非空就算成功
files = [Path("a.csv"), Path("b.csv"), Path("c.csv")]
ok = any(p.exists() and p.stat().st_size > 0 for p in files)
4.5 与字典搭配
user = {"name": "Alice", "age": 30}
# 任一字段缺失
print(any(k not in user for k in ("name", "email"))) # True
5. any vs all
| 函数 | 含义 |
|---|---|
any(xs) |
至少一个 truthy → True |
all(xs) |
全部 truthy → True(一个 falsy 就 False) |
xs = [1, 2, 3, 0]
print(any(xs)) # True
print(all(xs)) # False(因为 0 是 falsy)
二者都会短路:
any遇到真就停,all遇到假就停。
6. 易错点
- 空容器:
any([])→False,all([])→True。空集合的“所有元素
满足条件”是“真空真”。 - 不要和
or混淆:any用于“逐元素判断”,or用于“同一表达式
里多个条件”。# 正确:每个文件都存在 all(p.exists() for p in paths) # 错误用法(即便能跑,也不是 any 的本意) # any(p1.exists() or p2.exists() or p3.exists()) - 生成器 vs 列表:写成生成器
(x for x in xs)才能短路;写列表
[x for x in xs]会先全部算完再判断。
7. 小结
any(iterable):任一 truthy 即为True,短路。- 通常与 生成器表达式 配合,写法紧凑、内存友好。
- 与
all()是一对,理解两者的“空集”行为差异(any 空是False、all 空是
True)能避免一类微妙 bug。