Подтвердить что ты не робот

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

На странице docs python для any эквивалентный код для функции any() указан как:

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

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

any(x > 0 for x in list)

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

4b9b3361

Ответ 1

Если вы используете any(lst), вы видите, что lst является итерабельным, что является списком некоторых элементов. Если в нем содержится [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.

Ответ 2

(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 использует, и shortcircuits при встрече с первым объектом, который оценивает True

Ответ 3

>>> 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

Ответ 4

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

(x > 0 for x in list)

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

Ответ 5

Проще говоря, 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