Как именно работает функция python any ()?


на странице документов python для any, эквивалентный код для дано:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

как эта функция знает, какой элемент я хочу проверить, если вызвать его в этой форме?

any(x > 0 for x in list)

из определения функции все, что я вижу, это то, что я передаю итерационный объект. Как это for петли знаю, что я ищу что-то > 0?

5 77

5 ответов:

если вы используете any(lst) вы видите, что lst является iterable, который представляет собой список некоторых элементов. Если бы он содержал [0, False, '', 0.0, [], {}, None] (которые все имеют логические значения False), то any(lst) будет False. Если lst также содержит любое из следующих [-1, True, "X", 0.00001] (которые оценивают в True) то any(lst) будет True.

в коде, который вы разместили,x > 0 for x in lst, это другой вид итерации, называемый выражение генератор. Перед генератором выражений были добавлены в Python, вы бы создали понимание, который выглядит очень похожим, но с окружающим [] ' s:[x > 0 for x in lst]. Из lst С [-1, -2, 10, -4, 20], вы получите это понято список:[False, False, True, False, True]. Это внутреннее значение затем будет передано в any функция, которая будет возвращать True, так как есть хотя бы один True значение.

но с выражений генератор, Python больше не должен создайте этот внутренний список True(s) и False(s) значения будут сгенерированы как any функция перебирает значения, сгенерированные по одному выражением генератора. и С any короткие замыкания, он перестанет повторяться, как только увидит первый True значение. Это было бы особенно удобно, если вы создали lst использовать что-то вроде lst = range(-1,int(1e9)) (или xrange если вы используете вместо python2.x). Даже если это выражение будет создайте более миллиарда записей,any только должен идти до третьей записи, когда он доберется до 1, который оценивает True на x>0 и так any может возвратить True.

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

>>> names = ['King', 'Queen', 'Joker']
>>> any(n in 'King and john' for n in names)
True

>>> all(n in 'King and Queen' for n in names)
False

Это просто уменьшить несколько строк кода в один. Вам не нужно писать длинный код, например:

for n in names:
    if n in 'King and john':
       print True
    else:
       print False

(x > 0 for x in list) в этом вызове функции создается выражение генератора, например.

>>> nums = [1, 2, -1, 9, -5]
>>> genexp = (x > 0 for x in nums)
>>> for x in genexp:
        print x


True
True
False
True
False

, который any использует и короткие замыкания при встрече с первым объектом, который оценивает True

это потому, что iterable

(x > 0 for x in list)

отметим, что x > 0 возвращает True или False и, таким образом, у вас есть итерируемый булевых значений.

просто говоря, any () делает эту работу : в соответствии с условием, даже если он встречает одно значение выполнения в списке, он возвращает true, иначе он возвращает false.

list = [2,-3,-4,5,6]

a = any(x>0 for x in lst)

print a:
True


list = [2,3,4,5,6,7]

a = any(x<0 for x in lst)

print a:
False