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

Содержание статьи
Синтаксис и результат
Функция встроенная, импортировать ничего не нужно. Она принимает один аргумент - любой итерируемый объект: список, кортеж, множество, строку, словарь, генератор или файл.
any(iterable)Возвращаемое значение всегда типа bool, даже если элементы были числами или строками. Вот как результат зависит от содержимого:
| Элементы | Пример | any() |
|---|---|---|
| все истинные | [1, 'a', [0]] | True |
| хотя бы один истинный | [0, '', 7] | True |
| все ложные | [0, '', None, []] | False |
| пустая коллекция | [] | False |
По логике работы any() эквивалентна такому циклу. Его полезно запомнить, чтобы понимать все остальные примеры:
def my_any(iterable):
for element in iterable:
if element:
return True
return FalseЧто Python считает истинным
Функция не сравнивает элементы с True, она проверяет их истинность так же, как оператор if. Ложными считаются False, None, ноль любого числового типа (0, 0.0, 0j) и пустые коллекции: '', [], (), {}, set(). Все остальное истинно. Подробно правила описаны в статье про функцию bool.
print(any([0, False])) # False
print(any([0, False, 5])) # True
print(any(['False', 'False'])) # True: непустые строки
print(any([[], {}, ''])) # False: все коллекции пустыеТретья строка часто сбивает с толку. Строка 'False' состоит из пяти символов, поэтому она истинна, а слово внутри ничего не значит. Если данные пришли из файла или формы в виде текста, их нужно сначала преобразовать.
any() со строками и словарями
При переборе строки получаются отдельные символы. Любой символ, включая пробел и цифру 0, - это непустая строка длины 1, поэтому any() вернет False только для пустой строки.
print(any('000')) # True: символ '0' истинен
print(any(' ')) # True: пробел тоже
print(any('')) # False
print(any(map(str.isdigit, 'abc1'))) # True: есть цифраПоследняя строка показывает практичное применение: map() применяет метод str.isdigit к каждому символу, а any() отвечает, нашлась ли цифра. Так проверяют пароль или логин на наличие символов нужного вида.
Словарь при переборе отдает ключи, поэтому any() проверяет именно их, значения не учитываются.
print(any({0: 'да', '': 'нет'})) # False: оба ключа ложные
print(any({0: 'да', 1: 'нет'})) # True: ключ 1 истинен
print(any({'0': 0})) # True: ключ - непустая строка
print(any({0: 1}.values())) # True: проверяем значенияПроверка условия через генератор
Чаще всего в any() передают не готовый список, а выражение-генератор с условием. Код читается почти как обычная фраза: есть ли хоть один элемент, для которого выполняется условие.
ages = [12, 15, 21]
print(any(age >= 18 for age in ages)) # True
files = ['report.pdf', 'photo.jpg', 'notes.txt']
print(any(f.endswith('.exe') for f in files)) # False
stop_words = ['спам', 'казино']
text = 'Бесплатное казино без регистрации'
print(any(w in text.lower() for w in stop_words)) # TrueСкобки генератора можно не писать, когда он единственный аргумент функции. Синтаксис таких выражений разобран в статье о генераторах Python.
Досрочная остановка перебора
Функция прекращает работу на первом истинном элементе и дальше коллекцию не смотрит. С генератором это экономит вычисления, а со списковым включением экономии нет: список строится целиком еще до вызова any().
def check(x):
print('проверка', x)
return x > 2
any(check(x) for x in [1, 3, 5])
# проверка 1
# проверка 3
any([check(x) for x in [1, 3, 5]])
# проверка 1
# проверка 3
# проверка 5Разница заметна, когда проверка дорогая: запрос к сети, чтение файла, тяжелое вычисление. Благодаря ленивой работе any() подходит и для бесконечных итераторов, если истинный элемент в них гарантированно встретится.
any() и альтернативы
Для некоторых задач есть более прямые инструменты. Выбор зависит от того, что именно нужно узнать.
- Есть ли конкретное значение в коллекции: оператор
in. Запись5 in numbersкороче и понятнее, чемany(x == 5 for x in numbers). - Нужен сам найденный элемент, а не только факт:
next((x for x in items if x > 2), None)вернет первый подходящий элемент илиNone. - Два-три условия, известные заранее: обычный
a or b or c. Он возвращает сам объект, а неbool. - Все элементы должны быть истинными: парная функция all().
Сочетание not any(...) означает, что ни один элемент не подходит. Оно равносильно all(not x for x in ...), но читается проще. Описание функции есть в официальной документации.
Частые вопросы
Короткие ответы на вопросы, которые возникают при использовании any().
Почему any([]) возвращает False?
Функция ищет хотя бы один истинный элемент. В пустой коллекции элементов нет, значит, и истинного не найдено. Это зеркальное поведение к all([]), которая возвращает True.
Можно ли передать в any() несколько аргументов?
Нет, вызов any(a, b) завершится ошибкой TypeError. Значения нужно обернуть в коллекцию: any([a, b]) или any((a, b)).
Как проверить, что в строке есть заглавная буква?
Используйте генератор с методом строки: any(ch.isupper() for ch in s). По той же схеме проверяют цифры через isdigit() и пробелы через isspace().
Работает ли any() с массивами NumPy?
Встроенная any() работает с одномерным массивом, но для многомерного выбросит ValueError. Для массивов NumPy используйте метод arr.any() или функцию np.any(), они работают быстрее и понимают параметр axis.