R / Richie全部文章 ↑

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]

逐项拆解:

  1. (s[i] != char for s in strs):生成器,依次产生每个串在 i 处的字符
    是否等于 char。
  2. any(...):只要存在“任一不等” → 返回 True。
  3. 命中 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。