Ответ 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
.