¿Cómo funciona esta entrada con la función ‘cualquiera’ de Python? [duplicate]

4 minutos de lectura

avatar de usuario
pitoniku

En la página de documentos de Python para anyel código equivalente para el any() función se da como:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

¿Cómo sabe esta función qué elemento quiero probar si lo llamo de esta forma?

any(x > 0 for x in list)

De la definición de la función, todo lo que puedo ver es que estoy pasando un objeto iterable. Cómo hace el for bucle sé que estoy buscando algo > 0?

  • Esta pregunta, como resultado, en realidad no se trataba de anypero sobre el argumento a any en el código de ejemplo, que es un generador de expresión. Por lo tanto, lo cerré como un duplicado de la pregunta de referencia para expresiones generadoras. Si realmente está buscando información sobre anyconsulte stackoverflow.com/questions/19389490 para ver el canonical.

    – Karl Knechtel

    hace 3 horas


avatar de usuario
PabloMcG

Si utiliza any(lst) ves eso lst es el iterable, que es una lista de algunos elementos. si contuviera [0, False, '', 0.0, [], {}, None] (que tienen valores booleanos de False) después any(lst) sería False. Si lst también contenía cualquiera de los siguientes [-1, True, "X", 0.00001] (todos los cuales se evalúan como True) después any(lst) sería True.

En el código que publicaste, x > 0 for x in lsteste es un tipo diferente de iterable, llamado generador de expresión. Antes de que se agregaran expresiones de generador a Python, habría creado un lista de comprensiónque se ve muy similar, pero con los alrededores []‘s: [x > 0 for x in lst]. Desde el lst que contiene [-1, -2, 10, -4, 20]obtendrías esto lista comprendida: [False, False, True, False, True]. Este valor interno luego se pasaría al any función, que devolvería Trueya que hay al menos una True valor.

Pero con generador de expresionesPython ya no tiene que crear esa lista interna de True(s) y False(s)los valores se generarán como el any La función itera a través de los valores generados uno a la vez por la expresión del generador. Yya que 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ás usando Python2.x). Aunque esta expresión generará más de mil millones de entradas, any solo tiene que ir hasta la tercera entrada cuando llega a 1que evalúa True por x>0y entonces any puede volver True.

Si hubieras creado un lista de comprensiónPython primero habría tenido que crear la lista de mil millones de elementos en la memoria y luego pasarla a any. Pero al usar un generador de expresiónpuede tener las funciones integradas de Python como any y all salir temprano, tan pronto como un True o False se ve el valor.

  • También valdría la pena mencionar que any(x > 0 for x in list) es solo un azúcar sintáctico para any((x > 0 for x in list)).

    – jorge

    12 de mayo de 2013 a las 9:53

  • deberías agregar None a la lista de elementos que tienen valores booleanos de False

    – Alok Mysore

    26/10/2016 a las 16:55

  • Agregando a @georg, el azúcar sintáctico no es especial para any. def b(x): return x; print b(x > 1 for x in xs) # prints <generator object ..

    – trabajador de la industria3595112

    17 de enero de 2018 a las 7:50

  • @georg Gracias por esta aclaración. Este es un punto realmente importante que me confundió al probar el código con corchetes.

    – Masayo Música

    24 de junio de 2020 a las 22:09

avatar de usuario
Pranjay Kaparuwan

>>> names = ['King', 'Queen', 'Joker']
>>> any(n in 'King and john' for n in names)
True

>>> all(n in 'King and Queen' for n in names)
False

Simplemente reduce varias líneas de código en una. No tienes que escribir un código largo como:

for n in names:
    if n in 'King and john':
       print True
    else:
       print False

avatar de usuario
jamilak

(x > 0 for x in list) en esa función, la llamada crea una expresión generadora, por ejemplo.

>>> nums = [1, 2, -1, 9, -5]
>>> genexp = (x > 0 for x in nums)
>>> for x in genexp:
        print x


True
True
False
True
False

Cual any usos y cortocircuitos al encontrar el primer objeto que evalúa True

avatar de usuario
monstruoso

Es porque el iterable es

(x > 0 for x in list)

Tenga en cuenta que x > 0 devuelve cualquiera True o False y por lo tanto tienes un iterable de booleanos.

avatar de usuario
Alisha

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.

list = [2,-3,-4,5,6]

a = any(x>0 for x in lst)

print a:
True


list = [2,3,4,5,6,7]

a = any(x<0 for x in lst)

print a:
False

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad