Python all 函数
上次修改时间:2025 年 4 月 11 日
这份全面的指南探讨了 Python 的 all 函数,该函数检查可迭代对象中的所有元素是否都为真值(truthy)。我们将涵盖基本用法、空的可迭代对象、实际示例和性能注意事项。
基本定义
如果可迭代对象中的所有元素都为真(或可迭代对象为空),则 all 函数返回 True。 它等效于所有元素之间的一系列 and 运算。
主要特点:适用于任何可迭代对象,使用 Python 的真值规则,在第一个 False 处短路,并为空的可迭代对象返回 True。
列表的基本用法
以下是使用不同列表的简单用法,展示了 all 如何根据 Python 的规则评估元素的真值。
# All elements are true
print(all([True, 1, "hello"])) # True
# One false element
print(all([True, 0, "hello"])) # False
# Empty list
print(all([])) # True
# Mixed types
print(all([1, "a", [1], {1}])) # True
print(all([1, "", [1], {1}])) # False
此示例展示了 all 函数与不同列表配置的用法。 请注意它如何处理空列表(返回 True)和各种真/假值。
该函数遵循 Python 的真值规则:0、空字符串、空容器是 False,而其他值是 True。
数据验证
all 通常用于数据验证。 此示例检查列表中的所有数字是否满足某些条件。
numbers = [10, 20, 30, 40, 50] # Check if all numbers are positive print(all(n > 0 for n in numbers)) # True # Check if all numbers are even print(all(n % 2 == 0 for n in numbers)) # True # Add an odd number numbers.append(51) print(all(n % 2 == 0 for n in numbers)) # False
这演示了如何将 all 与生成器表达式结合使用以进行高效验证。 生成器是内存高效的,因为它会惰性地评估。
请注意 all 如何短路 - 它会在遇到的第一个 False 值处停止检查,从而使其成为高效的验证方式。
使用字典
all 可以检查字典的键、值或项。 此示例展示了使用字典的不同方法。
user = {
'name': 'Alice',
'age': 30,
'active': True,
'email': 'alice@example.com'
}
# Check all keys are non-empty strings
print(all(isinstance(k, str) and k for k in user.keys())) # True
# Check all values are truthy
print(all(user.values())) # True
# Check specific condition on values
print(all(v > 0 if isinstance(v, int) else True for v in user.values())) # True
# Add a false value
user['active'] = False
print(all(user.values())) # False
与字典一起使用时,all 会检查您提供的可迭代视图(键、值或项)。 这些示例展示了不同的验证模式。
第三个示例中的生成器表达式演示了仅适用于某些类型值的条件检查。
与 map() 结合使用
all 与 map() 配合使用效果很好,可以在检查其真值之前将函数应用于所有元素。
strings = ["hello", "world", "python"]
# Check all strings start with lowercase
print(all(map(lambda s: s[0].islower(), strings))) # True
# Check all strings are longer than 3 characters
print(all(map(lambda s: len(s) > 3, strings))) # True
# Add a short string
strings.append("hi")
print(all(map(lambda s: len(s) > 3, strings))) # False
# With a custom function
def is_valid_email(email):
return '@' in email and '.' in email.split('@')[-1]
emails = ["user@example.com", "admin@domain.org"]
print(all(map(is_valid_email, emails))) # True
这展示了 map 如何在 all 检查元素之前转换元素。 这种组合是内存高效的,因为它们都使用迭代器。
最后一个示例演示了使用命名函数进行更复杂的验证逻辑,同时保持可读性。
性能注意事项
此示例将 all 的性能与用于检查可迭代对象之间条件的其他方法进行比较。
import timeit
data = [True] * 1000 + [False]
def test_all():
return all(data)
def test_for_loop():
for item in data:
if not item:
return False
return True
def test_list_comprehension():
return len([x for x in data if not x]) == 0
print("all():", timeit.timeit(test_all, number=10000))
print("for loop:", timeit.timeit(test_for_loop, number=10000))
print("list comprehension:", timeit.timeit(test_list_comprehension, number=10000))
all 通常是最快的方法,因为它是在 C 中实现的,并且在第一个 False 值处短路。
列表推导效率最低,因为它在检查之前构建整个列表,即使第一个元素是 False。
最佳实践
- 用于提高可读性:为了清晰起见,请选择
all而不是手动循环 - 利用短路:首先放置最可能失败的检查
- 与生成器结合使用:为了提高处理大型数据集的内存效率
- 记录期望:清楚地说明“全部”在您的上下文中意味着什么
- 考虑 any() 对应项:当您需要“至少一个”而不是“全部”时使用
资料来源
作者
列出所有 Python 教程。