El arte de escribir bucles en Python





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 .






All Articles