all() в Python: как проверить все элементы сразу
Функция all() в Python возвращает True, когда каждый элемент итерируемого объекта истинен, и False, как только находит первый ложный. В статье разобраны синтаксис, неочевидный результат для пустой коллекции, особенности строк и словарей и практические задачи: проверка ввода, сортировки и типов данных.

Содержание статьи
Как работает all()
Функция встроенная и принимает ровно один аргумент - итерируемый объект. Результат всегда True или False. Внутри происходит простой перебор: каждый элемент проверяется на истинность, и при первом ложном работа заканчивается.
def my_all(iterable):
for element in iterable:
if not element:
return False
return TrueТакой код ведет себя так же, как настоящая all(), только медленнее, потому что встроенная функция написана на C. Из этой схемы сразу видны два следствия: перебор останавливается досрочно, а пустая коллекция дает True.
print(all([1, 3, 4, 5])) # True
print(all([1, 3, 4, 0])) # False: 0 ложный
print(all([0, False])) # False
print(all(['True', 'False'])) # True: обе строки непустые
print(all([[]])) # False: единственный элемент - пустой списокСтроки 'True' и 'False' истинны одинаково, поскольку функция смотрит не на текст, а на то, пустая ли строка. Список правил истинности для всех типов собран в статье о функции bool.
Почему all() для пустой коллекции возвращает True
Вызов all([]) дает True, и это не ошибка. Функция ищет контрпример, то есть ложный элемент. В пустой коллекции его нет, значит, утверждение "все элементы истинны" не опровергнуто. В логике это называют истинностью на пустом множестве.
print(all([])) # True
print(all('')) # True
print(all({})) # True
print(all(set())) # TrueНа практике это источник багов. Например, проверка "все оценки положительные" пройдет для студента без оценок. Если пустой набор должен считаться ошибкой, добавьте явную проверку длины:
scores = []
ok = bool(scores) and all(s > 0 for s in scores)
print(ok) # FalseСтроки, кортежи, множества и словари
С кортежами и множествами функция работает так же, как со списками. Отличия появляются у строк и словарей из-за того, что именно отдается при переборе.
Строка перебирается по символам. Каждый символ - непустая строка, поэтому для любой непустой строки ответ True, даже для '000'. Проверять содержимое строки нужно через методы: all(map(str.isalpha, 'Привет')) вернет True, если в строке только буквы.
Словарь отдает ключи, значения при этом не проверяются. Для проверки значений вызывают метод values().
d = {1: 0, 2: ''}
print(all(d)) # True: ключи 1 и 2 истинны
print(all(d.values())) # False: значения 0 и '' ложны
print(all({0: 'x'})) # False: ключ 0 ложныйПроверка условий через генератор
Главная сила all() раскрывается в паре с выражением-генератором. Одна строка заменяет цикл с флагом и break.
temps = [21, 23, 19, 25]
print(all(18 <= t <= 26 for t in temps)) # True: все в норме
items = [1, 2, True]
print(all(isinstance(x, int) for x in items)) # True: bool - подкласс int
nums = [3, 5, 8, 12]
print(all(a <= b for a, b in zip(nums, nums[1:]))) # True: отсортированПоследний пример проверяет сортировку без вызова sorted(): функция zip() составляет пары соседних элементов, и каждая пара сравнивается. С Python 3.10 то же самое короче пишется через itertools.pairwise(nums). Работа zip() подробно разобрана в статье zip и map в Python.
Пример с isinstance показывает ловушку: True проходит проверку на int, потому что тип bool наследуется от int. Если логические значения нужно отсеять, добавьте условие not isinstance(x, bool).
Валидация данных формы
Типичное применение - проверить, что пользователь заполнил все обязательные поля. Здесь удобно перебирать список имен полей, а не все значения словаря: необязательные поля могут оставаться пустыми.
form = {'name': 'Аня', 'email': 'a@mail.ru', 'phone': ''}
required = ('name', 'email')
if all(form.get(field, '').strip() for field in required):
print('Форма заполнена')
else:
missing = [f for f in required if not form.get(f, '').strip()]
print('Не заполнены:', missing)Метод strip() отсекает строки из одних пробелов, а get() с пустой строкой по умолчанию защищает от KeyError, если поля нет в словаре совсем.
Чем all() отличается от any()
Обе функции перебирают коллекцию и останавливаются досрочно, но ищут противоположное. all() останавливается на первом ложном элементе, any() на первом истинном.
| Ситуация | all() | any() |
|---|---|---|
| все элементы истинны | True | True |
| часть истинна, часть ложна | False | True |
| все элементы ложны | False | False |
| коллекция пустая | True | False |
Функции связаны законами де Моргана: all(x) равно not any(not e for e in x). Подробно вторая функция описана в статье про any() в Python.
Частые вопросы
Ответы на вопросы, которые чаще всего возникают при работе с all().
Как проверить, что все элементы списка одинаковые?
Сравните каждый элемент с первым: all(x == lst[0] for x in lst). Для хешируемых значений короче вариант len(set(lst)) <= 1, он также вернет True для пустого списка.
Как проверить, что все числа в списке положительные?
Передайте в функцию генератор с условием: all(x > 0 for x in numbers). Если список может быть пустым и это недопустимо, добавьте проверку numbers and ....
Почему all() с генератором работает быстрее, чем со списком?
Генератор вычисляет элементы по одному, и при первом ложном значении остальные вообще не вычисляются. Списковое включение в квадратных скобках сначала строит весь список, и только потом all() начинает проверку.
Чем all() отличается от оператора and?
Оператор and соединяет заранее известное число выражений и возвращает один из операндов, а не обязательно bool. all() принимает коллекцию любой длины и всегда возвращает True или False.