Сообщить об ошибке.

Функция any() в Python, хотя бы один элемент True

Проверяет, что хотя бы один элемент в последовательности True

Синтаксис:

any(iterable)

Параметры:

Возвращаемое значение:

Описание:

Функция any() возвращает True, если какой-либо (любой) элемент в итерируемом объекте является истинным True, в противном случае any() возвращает значение False.

Если последовательность пуста, то функция any() возвращает False.

Функция any() применяется для проверки истинности ЛЮБОГО из значений в итерируемом объекте и эквивалентна следующему коду:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

Дополнительно смотрите встроенную функцию all().

В основном функция any() применяется в сочетании с оператором ветвления программы if ... else. Работу функции any() можно сравнить с оператором or в Python, только any() работает с последовательностями:

>>> False or True or False
# True
>>> any([False, True, False])
# True

Но между or и any() в Python есть два основных различия:

  • Синтаксис.
  • Возвращаемое значение.

Функция any() всегда возвращает False или True.

>>> any([0, 2, 1, 0, 0])
# True
>>> any([0, 0, ''])
# False

Оператор or возвращает ПЕРВОЕ истинное значение, а если все значения False, то ПОСЛЕДНЕЕ ложное значение.

>>> 0 or 2 or 1 or 0 or 0
# 2
>>> 0 or 0 or ''
# ''


>>> bool(0 or 2 or 1 or 0 or 0)
# True
>>> bool(0 or 0 or '')
# False

Из всего сказанного можно сделать вывод, что для успешного использования функции any() необходимо в нее передавать последовательность, полученную в результате каких то вычислений/сравнений, элементы которого будут оцениваться как True или False. Это можно достичь применяя функцию map() или выражения-генераторы списков, используя в них встроенные функции языка, возвращающие bool значения, операции сравнения, оператор вхождения in и оператор идентичности is.

num = [1, 2.0, 3.1, 4, 5, 6, 7.9]
# использование встроенных функций 
# на примере 'isdigit()'
>>> [str(x).isdigit() for x in num]
# [True, False, False, True, True, True, False]

# использование операции сравнения
>>> [x > 4 for x in num]
# [False, False, False, False, True, True, True]

# использование оператора вхождения `in`
>>> ['.' in str(x) for x in num]
# [False, True, True, False, False, False, True]

# использование оператора идентичности `in`
>>> [type(x) is int for x in num]
# [True, False, False, True, True, True, False]

# использование функции map()
>>> list(map(lambda x: x > 1, num))
[False, True, True, True, True, True, True]

Рецепты применения any() в Python

Ниже - практические рецепты применения any() в Python (включая типовые ловушки и варианты, которые лучше читаются).

Проверка "есть хотя бы один истинный элемент" + пустые коллекции

any([0, "", None, False]) # False
any([0, "", 1]) # True
any([]) # False

"Хотя бы один элемент удовлетворяет условию" (основной паттерн)

nums = [1, 3, 6, 7]
any(n % 2 == 0 for n in nums) # True

Используйте генератор: any() делает short-circuit и не строит список.

Поиск "хотя бы одного" в словаре

Есть ли ключ:

any(k in data for k in ("id", "email"))

Есть ли непустое значение среди набора ключей:

any(data.get(k) for k in ("phone", "email", "telegram"))

Если 0/False - валидные значения, проверяйте явно:

any(k in data and data[k] is not None for k in ("discount", "flag"))

"Хотя бы одно поле заполнено" (форма/DTO)

payload = {"name": "", "email": "", "phone": "123"}
any(payload.values()) # True

Если нужно считать заполненным только "не пусто после strip":

any(isinstance(v, str) and v.strip() for v in payload.values())

"Есть хотя бы один матч" без построения списка

Часто вместо len([...]) > 0:

any(x > 10 for x in xs)

Это быстрее и экономнее по памяти.

Проверка пересечения множеств/списков: "есть общий элемент"

Лучше всего через множества:

a = {1, 2, 3}
b = {3, 4}
bool(a & b) # True (пересечение непусто)

Если у вас один набор маленький, а другой большой:

any(x in big_set for x in small_list)

Строки: "содержит хоть один символ из набора"

s = "passw0rd!"
any(ch.isdigit() for ch in s) # есть цифра?
any(ch.isupper() for ch in s) # есть верхний регистр?
any(ch in "!@#$" for ch in s) # есть спецсимвол?

Проверка наличия подстрок/паттернов

text = "error: failed to connect"
any(word in text.lower() for word in ("error", "fatal", "panic"))

Регулярные выражения: "хотя бы одно правило сработало"

import re
rules = [re.compile(r"\bcat\b"), re.compile(r"\bdog\b")]
any(r.search(message) for r in rules)

С вложенными структурами: "хотя бы один элемент где-то внутри"

matrix = [[0, 0], [0, 1]]
any(any(x != 0 for x in row) for row in matrix) # True

Условие "достаточно одного успешного" (например, несколько источников)

def try_sources(sources):
    return any(src.is_available() and src.ping() for src in sources)

any() прекратит проверки после первого True, что удобно для "фолбэков".

Эквивалентности с all() (De Morgan) для читаемости

Иногда лучше выразить мысль так:

  • "Есть хотя бы один плохой":
any(is_bad(x) for x in items)
  • "Не все хорошие" (то же самое):
not all(is_good(x) for x in items)

Выбирайте вариант, который ближе к бизнес-смыслу (часто any(is_bad...) читается проще).

Частые ошибки/тонкости

  • any(xs) проверяет truthiness элементов. Если элементы - строки, то "0" считается True, а "" False. Если нужна другая логика - используйте явный предикат.
  • Не делайте так: any([pred(x) for x in xs]) - лишний список. Правильно: any(pred(x) for x in xs).
  • Помните: any([]) == False. Если пустой набор должен считаться ошибкой - добавляйте bool(xs) and any(...).