any() и all() в Python: как проверять условия в списках и других коллекциях
Поисковый запрос any all Python часто появляется у тех, кто уже умеет писать циклы, но хочет делать проверки короче и понятнее. В Python для этого есть две встроенные функции: any() и all(). Они особенно полезны при валидации данных, фильтрации списков, проверке прав доступа и анализе результатов.
Коротко: что делают any() и all()
any() возвращает True, если хотя бы один элемент истинный. all() возвращает True, если все элементы истинные.
values = [False, False, True]
print(any(values)) # True, потому что есть хотя бы один True
print(all(values)) # False, потому что не все элементы True
Под истинностью в Python понимается не только значение True. Например, непустая строка, ненулевое число и непустой список считаются истинными, а 0, пустая строка, None и пустая коллекция — ложными.
Пример с обычным циклом и с any()
Допустим, нужно понять, есть ли в списке оценок хотя бы одна неудовлетворительная оценка ниже 50.
scores = [78, 91, 43, 88]
has_failed = False
for score in scores:
if score < 50:
has_failed = True
break
print(has_failed) # True
То же самое через any() записывается в одну строку:
scores = [78, 91, 43, 88]
has_failed = any(score < 50 for score in scores)
print(has_failed) # True
Здесь используется генераторное выражение: score < 50 for score in scores. Оно по очереди создаёт булевы значения, а any() проверяет, встретилось ли среди них хотя бы одно True.
Пример с all(): все ли условия выполнены
all() удобно использовать, когда нужно убедиться, что каждый элемент проходит проверку. Например, все пользователи должны быть совершеннолетними:
ages = [22, 19, 31, 18]
only_adults = all(age >= 18 for age in ages)
print(only_adults) # True
Если хотя бы одно значение не подходит, результат будет False:
ages = [22, 17, 31, 18]
only_adults = all(age >= 18 for age in ages)
print(only_adults) # False
Практический пример: валидация формы
Представим, что у нас есть данные регистрации. Нужно проверить, что имя не пустое, email содержит символ @, а пароль достаточно длинный.
user = {
'name': 'Анна',
'email': 'anna@example.com',
'password': 'secure123'
}
checks = [
len(user['name']) > 0,
'@' in user['email'],
len(user['password']) >= 8
]
if all(checks):
print('Данные корректны')
else:
print('Есть ошибки')
Такой подход хорош для простых проверок. Если нужно вывести конкретные сообщения об ошибках, лучше хранить проверки вместе с текстом ошибки.
def validate_user(user):
errors = []
if not user.get('name'):
errors.append('Имя обязательно')
if '@' not in user.get('email', ''):
errors.append('Некорректный email')
if len(user.get('password', '')) < 8:
errors.append('Пароль должен быть не короче 8 символов')
return errors
errors = validate_user(user)
if not any(errors):
print('Регистрация разрешена')
else:
print(errors)
В последнем примере any(errors) проверяет, есть ли хотя бы одна ошибка. Но в реальном коде для списков ошибок часто ещё проще писать if not errors.
Важная особенность: короткое замыкание
any() и all() не всегда проходят по всей коллекции. any() останавливается, как только находит первое истинное значение. all() останавливается, как только находит первое ложное значение.
def check_number(number):
print('Проверяем:', number)
return number > 10
numbers = [3, 7, 15, 20]
result = any(check_number(n) for n in numbers)
print(result)
Функция проверит 3, 7 и 15, а до 20 уже не дойдёт, потому что для any() достаточно первого успешного условия. Это делает код не только короче, но и эффективнее.
Пустые коллекции: частая ловушка
Поведение на пустых коллекциях нужно запомнить:
print(any([])) # False
print(all([])) # True
Почему all([]) возвращает True? Потому что в пустой коллекции нет ни одного элемента, который нарушает условие. Это математически корректно, но иногда неожиданно для новичков.
Если пустой список должен считаться ошибкой, проверяйте это отдельно:
products = []
if products and all(product['price'] > 0 for product in products):
print('Все цены корректны')
else:
print('Список пуст или есть некорректные цены')
any() и all() со словарями
Если передать словарь напрямую, Python будет перебирать его ключи, а не значения.
settings = {
'debug': False,
'cache': True,
'email_notifications': False
}
print(any(settings)) # True, потому что ключи непустые строки
print(any(settings.values())) # True, потому что cache = True
Если нужно проверять значения словаря, используйте .values(). Если пары ключ-значение — используйте .items().
users = {
'alice': True,
'bob': True,
'admin': False
}
all_active = all(is_active for is_active in users.values())
print(all_active) # False
Генератор лучше списка
Новички часто пишут так:
numbers = [1, 2, 3, 4, 5]
result = any([n % 2 == 0 for n in numbers])
Код работает, но создаёт лишний список в памяти. Лучше убрать квадратные скобки:
numbers = [1, 2, 3, 4, 5]
result = any(n % 2 == 0 for n in numbers)
Генераторное выражение особенно полезно на больших данных: элементы вычисляются по одному, а проверка может остановиться раньше конца коллекции.
Типичные ошибки
- Путать проверку элементов и проверку самой коллекции.
any(numbers)проверяет, есть ли в списке истинные элементы, а не то, что список непустой. - Забывать про пустой список.
all([])возвращаетTrue, поэтому при необходимости добавляйте проверкуif items and all(...). - Создавать список там, где нужен генератор. В большинстве случаев пишите
any(condition for item in items). - Сравнивать с True. Вместо
if any(... ) == Trueпишите простоif any(...).
Когда использовать any() и all()
Используйте any(), если вопрос звучит как: есть ли хотя бы один подходящий элемент? Используйте all(), если вопрос звучит как: все ли элементы подходят?
files = ['report.pdf', 'photo.jpg', 'archive.zip']
has_images = any(name.endswith('.jpg') for name in files)
all_are_pdf = all(name.endswith('.pdf') for name in files)
print(has_images) # True
print(all_are_pdf) # False
Если вы хотите глубже разобраться не только в таких встроенных функциях, но и в том, как писать чистый, уверенный Python-код на практике, посмотрите курс Python с нуля до уровня уверенного разработчика. Он хорошо подходит тем, кто хочет системно закрыть пробелы и перейти от отдельных примеров к полноценным программам.
Итог
any() и all() — простые, но очень полезные инструменты Python. Они заменяют громоздкие циклы, делают проверки выразительными и помогают писать код ближе к естественному языку. Главное — помнить про истинность значений, короткое замыкание, поведение пустых коллекций и использовать генераторные выражения вместо лишних списков.
-
Создано 01.07.2026 17:00:56
-
Михаил Русаков

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.