Что такое функции any и all и как они работают со списками в Python
Что проверяют
Знаете ли вы встроенные функции и понимаете ли ленивую семантику: обе прекращают обход на первом решающем элементе. Ещё проверяют, помните ли вы поведение на пустой последовательности, потому что именно оно чаще всего ломает условия в рабочем коде.
Как отвечать
any(iterable) возвращает True, если истинен хотя бы один элемент, all(iterable) возвращает True, если истинны все. Обе принимают любой итерируемый объект, а не только список, и обе возвращают именно bool, а не сам элемент.
nums = [0, None, 5]
any(nums) # True, обход остановится на 5
all(nums) # False, обход остановится на 0
any(n > 3 for n in nums if n) # True, генератор не строит список
any([]) # False
all([]) # TrueДальше две вещи, которые и хотят услышать. Первая это короткое замыкание: any прекращает обход на первом истинном значении, all на первом ложном, поэтому выражение-генератор внутри дешевле списка, элементы после решающего просто не вычисляются. Вторая это пустой случай: all от пустой последовательности истинно, потому что нет ни одного элемента, нарушающего условие. Если пустой ввод для вашей логики некорректен, проверяйте его отдельной строкой.
Истинность определяется обычными правилами языка: ноль, пустая строка, пустой список и None ложны. Поэтому all(names) проверяет не только непустоту самого списка, но и что среди имён нет пустых строк.
Где спотыкаются
Пишут any([f(x) for x in items]). Список строится целиком, f вызывается для каждого элемента, даже когда ответ ясен на первом, и смысл короткого замыкания теряется. Достаточно убрать квадратные скобки.
Ждут, что вернётся найденный элемент. Обе функции отвечают только да или нет, за самим значением идут к next по генератору с запасным вариантом.
Переносят привычку на массивы numpy. Встроенный any от двумерного массива падает с ошибкой неоднозначности истинности, у массивов свои одноимённые методы, и ведут они себя поэлементно.