Если вы используете, 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
.
any(x > 0 for x in list)
это просто синтаксический сахар дляany((x > 0 for x in list))
.None
в список элементов, которые имеют логические значенияFalse
any
.def b(x): return x; print b(x > 1 for x in xs) # prints <generator object ..
Он просто сокращает несколько строк кода в одну. Вам не нужно писать длинный код вроде:
источник
(x > 0 for x in list)
в этом вызове функции создается выражение генератора, например.Который
any
использует, и короткие замыкания при обнаружении первого объекта, который оцениваетTrue
источник
Это потому, что итерация
Обратите внимание, что
x > 0
возвращает либоTrue
или,False
и, следовательно, у вас есть итерация логических значений.источник
Проще говоря, any () выполняет эту работу: в соответствии с условием, даже если он встречает одно выполняющее значение в списке, он возвращает true, иначе он возвращает false.
источник