Рубрики
Без рубрики

any() и all() в Python с примерами

В этом уроке мы рассмотрим примеры и практическое использование удобных функций any() и all() в Python.

Автор оригинала: Olivera Popović.

any() и all() в Python с примерами

Введение в любой() и все()

В этом уроке мы рассмотрим функции any() и all() в Python.

any(iterable) и all(iterable) являются встроенными функциями в Python и существуют с момента выпуска Python 2.5. Обе функции эквивалентны написанию ряда операторов или и и соответственно между каждым из элементов переданного итерируемого . Они оба являются удобными функциями, которые сокращают код, заменяя шаблонные циклы.

Оба метода закорачивают и возвращают значение как можно скорее, поэтому даже с огромными итерациями они настолько эффективны, насколько это возможно.

Операторы и/или

Давайте вспомним, как работают операторы и /| или , поскольку эти функции основаны на них.

Оператор or

Оператор или вычисляет значение True если какое-либо из условий (операндов) равно True .

print("(2 == 2) or (3 == 3) evaluates to: " + str((2 == 2) or (3 == 3)))
print("(2 == 2) or (3 == 2) evaluates to: " + str((2 == 2) or (3 == 2)))
print("(2 == 0) or (3 == 2) evaluates to: " + str((2 == 0) or (3 == 2)))

Выход:

(2 == 2) or (3 == 3) evaluates to: True
(2 == 2) or (3 == 2) evaluates to: True
(2 == 0) or (3 == 2) evaluates to: False

Мы можем связать несколько или s в одном операторе, и он снова будет вычисляться как True если какие-либо условия являются Истинными :

print(str(False or False or False or True or False))

Это приводит к:

True

Оператор и

Оператор и вычисляет значение True только если все условия Истинны :

print("(2 == 2) and (3 == 3) evaluates to: " + str((2 == 2) and (3 == 3)))
print("(2 == 2) and (3 == 2) evaluates to: " + str((2 == 2) and (3 == 2)))
print("(2 == 0) and (3 == 2) evaluates to: " + str((2 == 0) and (3 == 2)))

Выход:

(2 == 2) and (3 == 3) evaluates to: True
(2 == 2) and (3 == 2) evaluates to: False
(2 == 0) and (3 == 2) evaluates to: False

Аналогично или , мы можем связать несколько операторов и , и они будут вычислять True только если все операнды вычисляются в Правда :

print(str(True and True and True and False and True))

Это приводит к:

False

какой-нибудь()

Метод any(iterable) ведет себя как ряд или операторов между каждым элементом iterable , который мы передали. Он используется для замены петель, подобных этой:

for element in some_iterable:
    if element:
        return True
return False

Мы получаем тот же результат, просто вызывая any(some_iterable) :

print(any([2 == 2, 3 == 2]))
print(any([True, False, False]))
print(any([False, False]))

Запуск этого фрагмента кода приведет к:

True
True
False

Примечание : Неожиданное поведение может произойти при использовании any() со словарями и типами данных, отличными от boolean . Если any() используется со словарем, он проверяет, является ли какой-либо из ключей равным True , а не значения :

dict = {True : False, False: False}

print(any(dict))

Это выводит:

True

В то время как если бы any() проверил значения, то вывод был бы False .

Метод any() часто используется в сочетании с методом map() и пониманием списка:

old_list = [2, 1, 3, 8, 10, 11, 13]
list_if_even = list(map(lambda x: x % 2 == 0, old_list))
list_if_odd = [x % 2 != 0 for x in old_list]

print(list_if_even)
print(list_if_odd)

print("Are any of the elements even? " + str(any(list_if_even)))
print("Are any of the elements odd? " + str(any(list_if_odd)))

Это выводит:

[True, False, False, True, True, False, False]
[False, True, True, False, False, True, True]
Are any of the elements even? True
Are any of the elements odd? True

Примечание: Если пустой итеративный передается в any() , метод возвращает False .

Если вы хотите узнать больше о функциях map(), filter() и reduce (), мы вас накроем!

все()

Метод all(iterable) вычисляется как серия операторов и между каждым из элементов в iterable , которые мы передали. Он используется для замены петель, подобных этой:

for element in iterable:
    if not element:
        return False
return True

Метод возвращает True только в том случае, если каждый элемент в iterable имеет значение True и False в противном случае:

print(all([2 == 2, 3 == 2]))
print(all([2 > 1, 3 != 4]))
print(all([True, False, False]))
print(all([False, False]))

Это выводит:

False
True
False
False

Примечание : Как и в случае с any() , при передаче словарей и типов данных, отличных от boolean , может произойти неожиданное поведение . Опять же, если all() используется со словарем, он проверяет, все ли ключи оцениваются в True , а не значения .

Еще одно сходство с any() заключается в том, что all() также обычно используется в сочетании с функцией map() и пониманием списка:

old_list = ["just", "Some", "text", "As", "An", "example"]
list_begins_upper = list(map(lambda x: x[0].isupper(), old_list))
list_shorter_than_8 = [len(x) < 8 for x in old_list]

print(list_begins_upper)
print(list_shorter_than_8)

print("Do all the strings begin with an uppercase letter? " + str(all(list_begins_upper)))
print("Are all the strings shorter than 8? " + str(all(list_shorter_than_8)))

Это выводит:

[False, True, False, True, True, False]
[True, True, True, True, True, True]
Do all the strings begin with an uppercase letter? False
Are all strings shorter than 8? True

Примечание: Если пустой итеративный передается в all() , метод возвращает True ! Это происходит потому , что код для all() проверяет, есть ли какие-либо False элементы в iterable , а в случае пустого списка нет никаких элементов и, следовательно, нет никаких False элементов.

Логическое преобразование и любые(), все() функции

Распространенной причиной путаницы и ошибок при использовании любых логических операторов, а следовательно, и при использовании any() и all () , является то, что происходит, когда элементы не имеют типа данных boolean . Другими словами, когда они не совсем True of False но вместо этого должны быть оценены в Истина или Ложь .

Некоторые языки программирования не оценивают не – boolean типы данных в boolean s. Например, Java будет жаловаться, если вы попробуете что-то вроде if("some string") или if(15) и скажете вам, что используемый вами тип не может быть преобразован в boolean .

Python, с другой стороны, не делает ничего подобного и вместо этого преобразует то, что вы передали в boolean , не предупреждая вас об этом.

Python преобразует большинство вещей в True за некоторыми исключениями:

  • Любое числовое значение, равное 0 (включая 0.0), рассматривается как False . Распространенным заблуждением здесь является то, что отрицательные значения (-2, -3.3,…) рассматриваются как False , а также они не рассматриваются как False !
  • Любая пустая последовательность (или коллекция) рассматривается как False , включая пустую строку s, пустой список s и т. Д. Имейте в виду, что неожиданное поведение может произойти при использовании all() с пустым iterable (он вернет True ).
  • Фактическое логическое значение False , конечно, рассматривается как False , а также специальное значение None .

Несколько примеров того, как мы можем использовать способ, которым Python “логизирует” другие типы данных с помощью any() и all() .

list_of_strings = ["yet", "another", "example",""]
print("Do all strings have some content?", all(list_of_strings))

list_of_ints = [0, 0.0, -2, -5]
print("Are any of the ints different than 0?", any(list_of_ints))

Это выводит:

Do all strings have some content? False
Are any of the ints different than 0? True

Имейте в виду, что вы все еще можете захотеть написать более читаемый код, не используя неявное логическое преобразование, подобное этому.

Вывод

Обе функции any() и all() существуют для удобства и должны использоваться только тогда, когда они делают код короче, но сохраняют читабельность.

В этой статье мы перешли к функциям any() и all() и продемонстрировали их использование на нескольких примерах.