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

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

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

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus