Введение в any () и all ()
В этом руководстве мы рассмотрим функции any() и all() в Python.
any(iterable) и all(iterable) являются встроенными функциями в
Python и существуют с момента выпуска Python 2.5. Обе функции
эквивалентны записи серии or и and соответственно между каждым из
элементов переданного iterable . Обе эти удобные функции сокращают
код, заменяя стандартные циклы.
Оба метода выполняют короткое замыкание и возвращают значение как можно скорее, поэтому даже с огромными итерациями они настолько эффективны, насколько это возможно.
Операторы и / или
Напомним, как and / or , поскольку эти функции основаны на них.
Оператор or
Оператор 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
Мы можем связать несколько or в одном операторе, и он снова будет
оценивать значение True если какое-либо из условий True :
print(str(False or False or False or True or False))
Это приводит к:
True
Оператор and
Оператор and принимает значение 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
Подобно or , мы можем связать несколько and , и они будут иметь
значение True только если все операнды True :
print(str(True and True and True and False and True))
Это приводит к:
False
любой()
Метод any(iterable) ведет себя как последовательность or между
каждым элементом 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() со словарями и типами данных, отличными от
логических . Если 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() iterable , метод возвращает значение
False .
Если вы хотите узнать больше о функциях map (), filter () и reduce () , мы вам поможем!
все()
В all(iterable) метод оценивает , как ряд and операторы между каждым
из элементов в 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() iterable , метод возвращает True !
Это связано с тем, что код для all() проверяет, есть ли какие-либо
элементы False iterable , а в случае пустого списка элементов нет и,
следовательно, нет элементов False
Логическое преобразование и функции any (), all ()
Распространенной причиной путаницы и ошибок при использовании любых
логических операторов и, следовательно, при использовании any() и
all() также является то, что происходит, когда элементы не относятся к
boolean типу данных. Другими словами, когда они не совсем True или
False а должны быть оценены как True или False .
Некоторые языки программирования не преобразуют boolean типы данных в
boolean . Например, Java пожалуется, если вы попробуете что-то вроде
if("some string") или if(15) и скажете, что используемый вами тип не
может быть преобразован в boolean .
Python, с другой стороны, не делает этого, а вместо этого преобразует
то, что вы передали, в boolean не предупреждая вас об этом.
Python преобразует большинство вещей в True за некоторыми
исключениями:
- Любое числовое значение, равное 0 (включая 0,0), считается
False. Распространенным заблуждением здесь является то, что отрицательные значения (-2, -3,3, ...) также рассматриваются какFalse, они не рассматриваются какFalse! - Любая пустая последовательность (или коллекция) обрабатывается как
False, включая пустуюstrings, пустойlists и т. Д. Имейте в виду, что при использованииall()с пустойiterableможет произойти непредвиденное поведение (она вернетTrue). - Фактическое
booleanзначение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
Имейте в виду, что вы все же можете захотеть написать более читаемый
код, не используя неявное boolean преобразование, подобное этому.
Заключение
Обе функции any() и all() существуют для удобства и должны
использоваться только тогда, когда они делают код короче, но сохраняют
удобочитаемость.
В этой статье мы перешли к any() и all() и продемонстрировали их
использование на нескольких примерах.