Как именно работает функция 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