Как именно работает функция 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 ответов:
если вы используете
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