Jeśli używasz any(lst)
, widzisz, że lst
jest to iterowalne, czyli lista niektórych elementów. Gdyby zawierał [0, False, '', 0.0, [], {}, None]
(wszystkie mają wartości logiczne False
), to any(lst)
byłoby False
. Gdyby lst
zawierał również którykolwiek z następujących elementów [-1, True, "X", 0.00001]
(z których wszystkie mają wartość True
), to any(lst)
byłoby True
.
W opublikowanym kodzie x > 0 for x in lst
jest to inny rodzaj iterowalnej, zwany wyrażeniem generatora . Przed wyrażenia generatorów dodano do Pythona, byś stworzył listowych , która wygląda bardzo podobnie, ale z otoczeniem []
„s [x > 0 for x in lst]
. Od lst
zawierający [-1, -2, 10, -4, 20]
, co można uzyskać to pojętej listy : [False, False, True, False, True]
. Ta wewnętrzna wartość zostanie następnie przekazana do any
funkcji, która zwróci True
, ponieważ istnieje co najmniej jedna True
wartość.
Ale dzięki wyrażeniom generatora Python nie musi już tworzyć tej wewnętrznej listy True(s)
i False(s)
, wartości będą generowane, gdy any
funkcja iteruje po wartościach generowanych pojedynczo przez wyrażenie generatora. A ponieważ any
wystąpią zwarcia, zatrzyma iterację, gdy tylko zobaczy pierwszą True
wartość. Byłoby to szczególnie przydatne, gdybyś utworzył lst
coś w rodzaju lst = range(-1,int(1e9))
(lub xrange
jeśli używasz Python2.x ). Nawet jeśli to wyrażenie będzie generować ponad miliard wpisy, any
ma tylko iść tak daleko, jak w trzecim wejściu, gdy robi się 1
, rozpoznawaną True
na x>0
, a więc any
może powrócić True
.
Gdybyś utworzył listę składaną , Python musiałby najpierw utworzyć listę miliardów elementów w pamięci, a następnie przekazać ją do any
. Ale używając wyrażenia generatora , możesz mieć wbudowane funkcje Pythona, takie jak any
i all
przerywane wcześnie, gdy tylko zostanie zauważona wartość True
lub False
.
any(x > 0 for x in list)
jest to tylko cukier syntaktycznyany((x > 0 for x in list))
.None
do listy elementów, które mają wartości boolowskieFalse
any
.def b(x): return x; print b(x > 1 for x in xs) # prints <generator object ..
Po prostu zredukuj kilka linii kodu w jedną. Nie musisz pisać długiego kodu, takiego jak:
źródło
(x > 0 for x in list)
w tym wywołaniu funkcji tworzy wyrażenie generatora np.Który
any
używa i zwarcia przy napotkaniu pierwszego obiektu, który oceniaTrue
źródło
To dlatego, że iterowalność jest
Zwróć uwagę, że
x > 0
zwraca alboTrue
lub,False
więc masz iterowalną wartość logiczną.źródło
Mówiąc prosto, any () działa tak: zgodnie z warunkiem, nawet jeśli napotka jedną spełniającą wartość na liście, zwraca true, w przeciwnym razie zwraca false.
źródło