El lazo
for
es la herramienta de flujo de control más básica en la mayoría de los lenguajes de programación. Por ejemplo, un bucle
for
C simple se ve así:
int i;
for (i=0;i<N;i++)
{
//do something
}
No existe una forma mejor de escribir
for
un bucle en C. En casos complejos, por lo general, debe escribir bucles anidados desagradables o establecer muchas variables auxiliares (como
i
en el código anterior).
Afortunadamente, las cosas son más convenientes en Python. Hay muchos trucos en este idioma para escribir bucles más elegantes que nos faciliten la vida. En Python, es muy posible evitar los bucles anidados y las variables auxiliares, e incluso podemos personalizar el bucle nosotros mismos
for
.
Este artículo lo guiará a través de los trucos de bucle de Python más útiles. Espero que te ayude a experimentar la belleza de este idioma.
Obtenga valores e índices al mismo tiempo
Un ejemplo común de uso de un bucle
for
es obtener índices y valores de una lista. Cuando comencé a aprender Python, escribí mi código de esta manera:
for i in range(len(my_list)):
print(i, my_list[i])
Funcionó, por supuesto. Pero esta no es una solución al estilo de Python. Unos meses después, aprendí la implementación estándar de estilo Python:
for i, v in enumerate(my_list):
print(i, v)
Como podemos ver, la función incorporada
enumerate
nos facilita la vida.
Cómo evitar bucles anidados con la función Producto
Los bucles anidados son un verdadero dolor de cabeza. Pueden reducir la legibilidad de su código y dificultar su comprensión. Por ejemplo, interrumpir bucles anidados generalmente no es fácil de implementar. Necesitamos saber dónde se interrumpió el bucle más interno, el segundo bucle interno más alto, etc.
Afortunadamente, Python tiene una función
product
incorporada increíble
itertools
. Podemos usarlo para evitar escribir muchos bucles anidados.
Veamos qué tan útil es con un ejemplo sencillo:
list_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]
for a in list_a:
for b in list_b:
for c in list_c:
if a + b + c == 2077:
print(a, b, c)
# 70 2000 7
Como podemos ver, necesitamos tres bucles anidados para obtener tres números de tres listas, cuya suma es 2077. El código no es muy bonito.
Ahora intentemos usar una función
product
.
from itertools import product
list_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]
for a, b, c in product(list_a, list_b, list_c):
if a + b + c == 2077:
print(a, b, c)
# 70 2000 7
Como podemos ver, gracias al uso de la función
product
, solo un ciclo es suficiente.
Dado que la función
product
genera un producto directo de los datos iterables de entrada, nos permite evitar bucles anidados en muchos casos.
Uso del módulo Itertools para escribir bucles agradables
De hecho, una función
product
es solo la punta del iceberg. Si aprende el módulo integrado de Python
itertools
, se abre un mundo completamente nuevo ante usted. Esta caja de herramientas contiene muchos métodos útiles para cubrir nuestras necesidades de bucle. Una lista completa de ellos se puede encontrar en la documentación oficial . Echemos un vistazo a algunos ejemplos.
Cómo crear un bucle sin fin
Hay al menos tres formas de crear un bucle infinito:
1. Usando una función
count
:
natural_num = itertools.count(1)
for n in natural_num:
print(n)
# 1,2,3,...
2. Función
cycle
:
many_yang = itertools.cycle('Yang')
for y in many_yang:
print(y)
# 'Y','a','n','g','Y','a','n','g',...
3. A través de la función
repeat
:
many_yang = itertools.repeat('Yang')
for y in many_yang:
print(y)
# 'Yang','Yang',...
Combinando varios iteradores en uno
La función le
chain()
permite combinar varios iteradores en uno.
from itertools import chain
list_a = [1, 22]
list_b = [7, 20]
list_c = [3, 70]
for i in chain(list_a, list_b, list_c):
print(i)
# 1,22,7,20,3,70
Seleccionar elementos duplicados adyacentes
La función se
groupby
utiliza para seleccionar elementos duplicados adyacentes en un iterador y unirlos.
from itertools import groupby
for key, group in groupby('YAaANNGGG'):
print(key, list(group))
# Y ['Y']
# A ['A']
# a ['a']
# A ['A']
# N ['N', 'N']
# G ['G', 'G', 'G']
Como se muestra arriba, los símbolos similares adyacentes están conectados entre sí. Además, podemos decirle a la función
groupby
cómo determinar la identidad de dos elementos:
from itertools import groupby
for key, group in groupby('YAaANNGGG', lambda x: x.upper()):
print(key, list(group))
# Y ['Y']
# A ['A', 'a', 'A']
# N ['N', 'N']
# G ['G', 'G', 'G']
Personalizando el ciclo
Después de revisar los ejemplos anteriores, pensemos en por qué los bucles de
for
Python son tan flexibles y elegantes. Por lo que tengo entendido, esto se debe al hecho de que podemos usar
for
funciones en el iterador de bucle . En todos los ejemplos anteriores, el iterador solo usa funciones especiales. Todos los trucos tienen el mismo patrón:
for x in function(iterator)
El módulo incorporado en sí
itertools
solo implementa las funciones más comunes para nosotros. Si olvidamos una función o no podemos encontrar la que necesitamos, podemos escribirla nosotros mismos. Para ser más precisos, estas funciones son generadores . Por eso podemos generar bucles infinitos con ellos.
Básicamente, podemos personalizar el bucle
for
como lo haríamos con un generador personalizado.
Echemos un vistazo a un ejemplo simple:
def even_only(num):
for i in num:
if i % 2 == 0:
yield i
my_list = [1, 9, 3, 4, 2, 5]
for n in even_only(my_list):
print(n)
# 4
# 2
Como puede ver en el ejemplo anterior, hemos definido un generador llamado
even_only
. Si usamos este generador en un ciclo for, la iteración solo ocurrirá para números pares de la lista.
Por supuesto, este ejemplo es solo una explicación. Hay otras formas de hacer lo mismo, como usar la Vista de lista .
my_list = [1, 9, 3, 4, 2, 5]
for n in (i for i in my_list if not i % 2):
print(n)
# 4
# 2
Producción
La tarea de crear bucles en Python se puede resolver de manera muy flexible y elegante. Para escribir loops convenientes y simples, podemos usar herramientas integradas o incluso definir generadores nosotros mismos.
Publicidad
Servidor confiable en alquiler , crea tu propia configuración en un par de clics y comienza a trabajar en un minuto. ¡Todo funcionará sin problemas y con un tiempo de actividad muy alto!
Únete a nuestro chat de Telegram .