all и any в Python: почему этот код печатает True
@python_quizРазберем этот квиз
Код:

Коротко: этот код выведет True. Ниже — подробный разбор, почему так происходит, разбор вариантов и полезные примечания.
Как работают all() и any()
- all(iterable) возвращает True, если все элементы iterable истинны (по правилам булевой приведённости). Особенность: all([]) == True (пустой итератор рассматривается как «все элементы удовлетворяют условию», т.е. vacuously true).
- any(iterable) возвращает True, если хотя бы один элемент iterable истинен. Для пустого iterable any([]) == False.
- Оба метода поддерживают короткое замыкание (short-circuit): all остановится при первом False, any — при первом True.
Поэтапная оценка выражения
Мы имеем генератор в any: (all(x) for x in flags). Оценим all(x) для каждого x в списке flags:
- x = [] -> all([]) = True (важная особенность)
- x = [0] -> all([0]) = False (0 считается ложным)
- x = [1] -> all([1]) = True (1 истинно)
- x = [None] -> all([None]) = False (None — ложь)
Если записать результаты для каждого элемента: True, False, True, False.
Но учитываем короткое замыкание any: оно возвращает True при первом же True, не дожидаясь остальных проверок. Поскольку первым элементом оказался пустой список, и all([]) дал True, any сразу завершился и вернул True.
Демонстрация (выполнение)

Вывод будет:

Обратите внимание: при непосредственном вызове any с генератором последующие all(x) для x после первого истинного значения могут вообще не вычисляться из-за короткого замыкания.
Анализ вариантов ответов (кратко)
- Вариант с выводом True — соответствует реальному поведению по описанной логике.
- Вариант False — неверен, потому что уже первый элемент даёт True.
- Вариант None — неверен: ни all, ни any не возвращают None в этом контексте.
- Вариант с
TypeError— неверен: ни all, ни any не вызываютTypeErrorна списках с числами/None; они просто проверяют булевую истинность элементов.
Полезные замечания и подводные камни
- all([]) == True — часто неожиданно для новичков. Это логическое соглашение: универсальное утверждение о пустом наборе истинно.
- При работе с генераторами и any/all учитывайте короткое замыкание — это можно использовать для "ленивых" проверок, где вычисление последующих элементов дорогостоящее.
- Будьте аккуратны, если ожидаете, что функция all вернёт False при наличии "ложного" значения: порядок элементов важен, и при использовании any(first_true...) первый True завершит проверку.
Вывод: поведение обусловлено семантикой all/any и порядком элементов в списке; в данном случае код печатает True.