Автор оригинала: 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()
и продемонстрировали их использование на нескольких примерах.