ZetCode

Python all 函数

上次修改时间:2025 年 4 月 11 日

这份全面的指南探讨了 Python 的 all 函数,该函数检查可迭代对象中的所有元素是否都为真值(truthy)。我们将涵盖基本用法、空的可迭代对象、实际示例和性能注意事项。

基本定义

如果可迭代对象中的所有元素都为真(或可迭代对象为空),则 all 函数返回 True。 它等效于所有元素之间的一系列 and 运算。

主要特点:适用于任何可迭代对象,使用 Python 的真值规则,在第一个 False 处短路,并为空的可迭代对象返回 True

列表的基本用法

以下是使用不同列表的简单用法,展示了 all 如何根据 Python 的规则评估元素的真值。

basic_all.py
# 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 通常用于数据验证。 此示例检查列表中的所有数字是否满足某些条件。

validation.py
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 可以检查字典的键、值或项。 此示例展示了使用字典的不同方法。

dict_all.py
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() 结合使用

allmap() 配合使用效果很好,可以在检查其真值之前将函数应用于所有元素。

map_all.py
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 的性能与用于检查可迭代对象之间条件的其他方法进行比较。

performance.py
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

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程