any() y all() en Python con ejemplos

En este tutorial, repasaremos ejemplos y el uso práctico de las funciones de conveniencia any() y all() en Python.

Introducción a any() y all()

En este tutorial, cubriremos las funciones any() y all() en Python.

any(iterable) y all(iterable) son funciones integradas en Python y existen desde que se lanzó Python 2.5. Ambas funciones equivalen a escribir una serie de operadores o y y respectivamente entre cada uno de los elementos del iterable pasado. Ambas son funciones de conveniencia que acortan el código al reemplazar los bucles repetitivos.

Ambos métodos hacen cortocircuito y devuelven un valor lo antes posible, por lo que incluso con iterables enormes, son tan eficientes como pueden ser.

Los operadores y/o

Recordemos cómo funcionan los operadores y/o, ya que estas funciones se basan en ellos.

El operador o

El operador o se evalúa como Verdadero si alguna de las condiciones (operandos) es Verdadero.

1
2
3
print("(2 == 2) or (3 == 3) evaluates to: " + str((2 == 2) or (3 == 3)))
print("(2 == 2) or (3 == 2) evaluates to: " + str((2 == 2) or (3 == 2)))
print("(2 == 0) or (3 == 2) evaluates to: " + str((2 == 0) or (3 == 2)))

Producción:

1
2
3
(2 == 2) or (3 == 3) evaluates to: True
(2 == 2) or (3 == 2) evaluates to: True
(2 == 0) or (3 == 2) evaluates to: False

Podemos encadenar múltiples “o” en una sola declaración, y nuevamente se evaluará como “Verdadero” si cualquiera de las condiciones es “Verdadero”:

1
print(str(False or False or False or True or False))

Esto resulta en:

1
True

El operador y

El operador y se evalúa como Verdadero solo si todas las condiciones son Verdaderas:

1
2
3
print("(2 == 2) and (3 == 3) evaluates to: " + str((2 == 2) and (3 == 3)))
print("(2 == 2) and (3 == 2) evaluates to: " + str((2 == 2) and (3 == 2)))
print("(2 == 0) and (3 == 2) evaluates to: " + str((2 == 0) and (3 == 2)))

Producción:

1
2
3
(2 == 2) and (3 == 3) evaluates to: True
(2 == 2) and (3 == 2) evaluates to: False
(2 == 0) and (3 == 2) evaluates to: False

De manera similar a o, podemos encadenar múltiples operadores y, y se evaluarán como Verdadero solo si todos los operandos se evalúan como Verdadero:

1
print(str(True and True and True and False and True))

Esto resulta en:

1
False

ningún()

El método cualquier(iterable) se comporta como una serie de operadores o entre cada elemento del iterable que pasamos. Se usa para reemplazar bucles similares a este:

1
2
3
4
for element in some_iterable:
    if element:
        return True
return False

Obtenemos el mismo resultado simplemente llamando a any(some_iterable):

1
2
3
print(any([2 == 2, 3 == 2]))
print(any([True, False, False]))
print(any([False, False]))

Ejecutar este fragmento de código daría como resultado:

1
2
3
True
True
False

Nota: Puede ocurrir un comportamiento inesperado al usar any() con diccionarios y tipos de datos que no sean booleanos. Si se usa any() con un diccionario, verifica si alguna de las claves se evalúa como Verdadero, no los valores:

1
2
3
dict = {True : False, False: False}

print(any(dict))

Esto da como resultado:

1
True

Mientras que, si any() verificaba los valores, la salida habría sido False.

El método any() se usa a menudo en combinación con el método map() y las listas de comprensión:

1
2
3
4
5
6
7
8
9
old_list = [2, 1, 3, 8, 10, 11, 13]
list_if_even = list(map(lambda x: x % 2 == 0, old_list))
list_if_odd = [x % 2 != 0 for x in old_list]

print(list_if_even)
print(list_if_odd)

print("Are any of the elements even? " + str(any(list_if_even)))
print("Are any of the elements odd? " + str(any(list_if_odd)))

Esto da como resultado:

1
2
3
4
[True, False, False, True, True, False, False]
[False, True, True, False, False, True, True]
Are any of the elements even? True
Are any of the elements odd? True

Nota: Si se pasa un iterable vacío a any(), el método devuelve False.

If you'd like to read more about las funciones map(), filter() y reduce(), we've got you covered!

todos()

El método all(iterable) se evalúa como una serie de operadores y entre cada uno de los elementos en el iterable que pasamos. Se utiliza para reemplazar bucles similares a este:

1
2
3
4
for element in iterable:
    if not element:
        return False
return True

El método devuelve Verdadero solo si cada elemento en iterable se evalúa como Verdadero, y Falso en caso contrario:

1
2
3
4
print(all([2 == 2, 3 == 2]))
print(all([2 > 1, 3 != 4]))
print(all([True, False, False]))
print(all([False, False]))

Esto da como resultado:

1
2
3
4
False
True
False
False

Nota: Al igual que con any(), puede ocurrir un comportamiento inesperado al pasar diccionarios y tipos de datos que no sean booleanos. Nuevamente, si all() se usa con un diccionario, verifica si todas las claves se evalúan como Verdadero, no los valores.

Otra similitud con any() es que all() también se usa comúnmente en combinación con la función map() y listas de comprensión:

1
2
3
4
5
6
7
8
9
old_list = ["just", "Some", "text", "As", "An", "example"]
list_begins_upper = list(map(lambda x: x[0].isupper(), old_list))
list_shorter_than_8 = [len(x) < 8 for x in old_list]

print(list_begins_upper)
print(list_shorter_than_8)

print("Do all the strings begin with an uppercase letter? " + str(all(list_begins_upper)))
print("Are all the strings shorter than 8? " + str(all(list_shorter_than_8)))

Esto da como resultado:

1
2
3
4
[False, True, False, True, True, False]
[True, True, True, True, True, True]
Do all the strings begin with an uppercase letter? False
Are all strings shorter than 8? True

Nota: Si se pasa un iterable vacío a all(), ¡el método devuelve True! Esto se debe a que el código para all() verifica si hay elementos False en el iterable, y en el caso de una lista vacía, no hay elementos y, por lo tanto, tampoco hay elementos False.

Conversión booleana y funciones any(), all()

Una causa común de confusión y errores cuando se usan operadores lógicos y, por lo tanto, cuando se usan cualquier() y todos() también, es lo que sucede cuando los elementos no son del tipo de datos booleano. En otras palabras, cuando no son exactamente Verdadero o Falso sino que tienen que ser evaluados como Verdadero o Falso.

Algunos lenguajes de programación no evalúan los tipos de datos que no son “booleanos” como “booleanos”. Por ejemplo, Java se quejaría si intentara algo como if("alguna cadena") o if(15) y le dijera que el tipo que usó no se puede convertir a booleano.

Python, por otro lado, no hace tal cosa y, en cambio, convertirá lo que pasó a boolean sin advertirle al respecto.

Python convierte la mayoría de las cosas a Verdadero con algunas excepciones:

  • Cualquier valor numérico igual a 0 (incluido 0.0) se trata como Falso. Un concepto erróneo común aquí es que los valores negativos (-2, -3.3,...) también se tratan como Falso, ¡no se tratan como Falso!
  • Cualquier secuencia (o colección) vacía se trata como Falsa, incluidas cadenas vacías, listas vacías, etc. Tenga en cuenta que puede ocurrir un comportamiento inesperado al usar all() con un iterable vacío (devolverá Verdadero).
  • El valor ‘booleano’ real ‘Falso’ se trata, por supuesto, como ‘Falso’, así como el valor especial ‘Ninguno’.

Algunos ejemplos de cómo podemos usar la forma en que Python "booleaniza" otros tipos de datos con any() y all().

1
2
3
4
5
list_of_strings = ["yet", "another", "example",""]
print("Do all strings have some content?", all(list_of_strings))

list_of_ints = [0, 0.0, -2, -5]
print("Are any of the ints different than 0?", any(list_of_ints))

Esto da como resultado:

1
2
Do all strings have some content? False
Are any of the ints different than 0? True

Tenga en cuenta que es posible que aún desee escribir un código más legible al no utilizar una conversión booleana implícita como esta.

Conclusión

Las funciones any() y all() están ahí por conveniencia y deben usarse solo cuando acortan el código pero mantienen la legibilidad.

En este artículo, saltamos a las funciones any() y all() y mostramos su uso a través de varios ejemplos.

Licensed under CC BY-NC-SA 4.0