Jeśli używasz any(lst)
widać, że lst
jest iterable, który znajduje się lista niektórych elementów, które. Jeśli zawierał [0, False, '', 0.0, [], {}, None]
(wszystkie mają wartości boolowskie False
), wówczas any(lst)
będzie False
. Jeśli lst
również zawiera którekolwiek z następujących [-1, True, "X", 0.00001]
(wszystkie z nich oceniają na True
), wówczas any(lst)
będzie True
.
W opublikowanym przez Ciebie kodzie, x > 0 for x in lst
, jest to inny rodzaj iteracji, nazywany wyrażeniem generującym . Zanim dodaliśmy wyrażeń generatora do Pythona, utworzysz listę ze zrozumieniem listy, która wygląda bardzo podobnie, ale z otoczeniem []
: [x > 0 for x in lst]
. Od lst
zawierającego [-1, -2, 10, -4, 20]
, otrzymasz tę zrozumiałą listę: [False, False, True, False, True]
. Ta wewnętrzna wartość zostanie następnie przekazana do funkcji any
, która zwróci wartość True
, ponieważ istnieje co najmniej jedna wartość True
.
Ale z Generator wyrażeń, Python nie musi już tworzyć tę wewnętrzną listę True(s)
i False(s)
wartości zostaną wygenerowane jak any
funkcyjne iteracji wartości wygenerowany w momencie wyrażenia generatora. i, ponieważ zwarcie, zatrzyma iterację, gdy tylko zobaczy pierwszą wartość True
. Byłoby to szczególnie przydatne, jeśli utworzysz lst
używając czegoś takiego jak lst = range(-1,int(1e9))
(lub xrange
, jeśli używasz Python2.x).Nawet jeśli to wyrażenie wygeneruje ponad miliard wpisów, tylko any
musi przejść tylko do trzeciego wpisu, gdy dojdzie do 1
, który ocenia True
dla x>0
, a więc any
może zwrócić True
.
Jeśli utworzyłeś listę ze zrozumieniem, Python musiałby najpierw utworzyć listę pamięci zawierającą miliard elementów, 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
, które ulegają przedwczesnemu złamaniu, gdy tylko pojawi się wartość True
lub False
.
Byłoby również wspomnieć, że 'dowolny (x> 0 dla x na liście)' jest po prostu cukier syntaktyczny dla 'dowolny ((x> 0 dla x w liście)) '. – georg
Powinieneś dodać 'Brak' do listy elementów, które mają wartości logiczne' Fałszywe' –
Dodając do @georg, cukier syntaktyczny nie jest specjalny dla 'any'. 'def b (x): return x; drukuj b (x> 1 dla x w xs) # drukuje
industryworker3595112