Si lo usa any(lst), verá que lstes 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 lsttambié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 lsteste 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 lstcontiene [-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 anyfunción, que regresaría True, ya que hay al menos un Truevalor.
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 anyfunción itera a través de los valores generados uno a la vez por la expresión generadora. Y , dado que hay anycortocircuitos, dejará de iterar tan pronto como vea el primer Truevalor. Esto sería especialmente útil si creó lstusando algo como lst = range(-1,int(1e9))(o xrangesi está usando Python2.x ). A pesar de que esta expresión generará más de mil millones entradas, anysólo tiene que ir hasta la tercera entrada cuando se llega a 1, que evalúa Truepara x>0, y así anypuede 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 anyy allsalgan temprano, tan pronto como se vea un valor Trueo False.
any(x > 0 for x in list)es solo un azúcar sintáctico paraany((x > 0 for x in list)).Nonea la lista de elementos que tienen valores booleanos deFalseany.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
anyutiliza y cortocircuitos al encontrar el primer objeto que evalúaTruefuente
Es porque lo iterable es
Tenga en cuenta que
x > 0devuelveTrueoFalsey, 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