Si lo usa any(lst)
, verá que lst
es el iterable, que es una lista de algunos elementos. Si contuviera [0, False, '', 0.0, [], {}, None]
(que todos tienen valores booleanos de False
), entonces any(lst)
sería False
. Si lst
también contiene alguno de los siguientes [-1, True, "X", 0.00001]
(todos los cuales se evalúan True
), entonces any(lst)
sería True
.
En el código que publicaste, x > 0 for x in lst
este es un tipo diferente de iterable, llamado expresión generadora . Antes de las expresiones generadoras se añadieron a Python, se habría creado una lista por comprensión , que es muy similar, pero con rodea []
's: [x > 0 for x in lst]
. Del lst
contiene [-1, -2, 10, -4, 20]
, se llega a esta lista comprendido : [False, False, True, False, True]
. Este valor interno luego se pasaría a la any
función, que regresaría True
, ya que hay al menos un True
valor.
Pero con las expresiones generadoras , Python ya no tiene que crear esa lista interna de True(s)
y False(s)
, los valores se generarán a medida que la any
función itera a través de los valores generados uno a la vez por la expresión generadora. Y , dado que hay any
cortocircuitos, dejará de iterar tan pronto como vea el primer True
valor. Esto sería especialmente útil si creó lst
usando algo como lst = range(-1,int(1e9))
(o xrange
si está usando Python2.x ). A pesar de que esta expresión generará más de mil millones entradas, any
sólo tiene que ir hasta la tercera entrada cuando se llega a 1
, que evalúa True
para x>0
, y así any
puede volver True
.
Si hubiera creado una lista de comprensión , Python primero habría tenido que crear la lista de mil millones de elementos en la memoria y luego pasarla a any
. Pero al usar una expresión generadora , puede hacer que las funciones integradas de Python como any
y all
salgan temprano, tan pronto como se vea un valor True
o False
.
any(x > 0 for x in list)
es solo un azúcar sintáctico paraany((x > 0 for x in list))
.None
a la lista de elementos que tienen valores booleanos deFalse
any
.def b(x): return x; print b(x > 1 for x in xs) # prints <generator object ..
Simplemente reduce varias líneas de código en una. No tiene que escribir un código extenso como:
fuente
(x > 0 for x in list)
en esa función, la llamada crea una expresión generadora, por ejemplo.Que
any
utiliza y cortocircuitos al encontrar el primer objeto que evalúaTrue
fuente
Es porque lo iterable es
Tenga en cuenta que
x > 0
devuelveTrue
oFalse
y, por lo tanto, tiene un iterable de booleanos.fuente
Simplemente diciendo, any () hace este trabajo: de acuerdo con la condición, incluso si encuentra un valor satisfactorio en la lista, devuelve verdadero, de lo contrario devuelve falso.
fuente