any(iterable)
True или False.Функция 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"))
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(...).