Введение в 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
, включая пустуюstring
s, пустойlist
s и т. Д. Имейте в виду, что при использовании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()
и продемонстрировали их
использование на нескольких примерах.