any, all и генераторные выражения
Проверка «хотя бы один» и «все»
| Функция | Вернёт True, если… |
|---|---|
| any(...) | хотя бы один элемент истинный |
| all(...) | все элементы истинные |
1 2 3 4
Генераторное выражение внутри
Внутри any и all пишут генераторное выражение — почти как списочное, но без квадратных скобок. Оно проверяет элементы по очереди, не строя весь список:
1 2
Заменяет громоздкие циклы с флагом
Раньше такую проверку писали через переменную-флаг. Сначала объявляли False, потом в цикле искали подходящий элемент и переключали флаг:
1 2 3 4 5 6
Ровно то же самое any делает одной строкой:
1
Для проверки «все элементы подходят» флаг заводили наоборот — начинали с True и сбрасывали при первом нарушении:
1 2 3
Сравнение двух записей:
| По-старому | Одной строкой |
|---|---|
| флаг False, ищем подходящий | any(условие for x in a) |
| флаг True, ищем нарушение | all(условие for x in a) |
Обрати внимание на инверсию условия: в цикле с флагом для all пишут if x <= 0, то есть противоположное условие, а внутри all — прямое x > 0. Именно на этой инверсии чаще всего ошибаются, когда переписывают цикл вручную.
Ленивость экономит время
any останавливается на первом истинном элементе, all — на первом ложном. Это ленивое вычисление: лишнюю работу Python не делает, поэтому на больших данных проверки быстрые.
Пример с ЕГЭ: задание 25
Формулировка: «Найдите числа диапазона, у которых все цифры различны и при этом есть хотя бы одна чётная цифра».
1 2 3 4
Здесь any заменяет отдельный цикл поиска чётной цифры, а условие про различные цифры удобнее проверить через множество.
Пример с ЕГЭ: задание 15
В задании 15 all — основной инструмент: он буквально означает «истинно для любого x».
1 2 3 4 5 6
Формулировке «существует такое x» соответствует any — меняется только имя функции.
Пример с ЕГЭ: задание 9 и таблицы
Проверки по строке таблицы тоже записываются одной строкой:
1 2 3
