A arte de escrever loops em Python





O loop for



é a ferramenta de fluxo de controle mais básica na maioria das linguagens de programação. Por exemplo, um simples loop for



C se parece com isto:



int i;
for (i=0;i<N;i++)
{
  //do something
}
      
      





Não há maneira mais agradável de escrever for



um loop C. Em casos complexos, geralmente você tem que escrever loops aninhados feios ou definir várias variáveis ​​auxiliares (como i



no código acima).



Felizmente, as coisas são mais convenientes em Python. Existem muitos truques nessa linguagem para escrever loops mais elegantes que tornam nossa vida mais fácil. Em Python, é perfeitamente possível evitar loops aninhados e variáveis ​​auxiliares, e podemos até mesmo personalizar o loop for



.



Este artigo irá guiá-lo pelos truques de looping mais úteis do Python. Espero que ajude você a experimentar a beleza desta linguagem.



Obtenha valores e índices ao mesmo tempo



Um exemplo comum de uso de loop for



é obter índices e valores de uma lista. Quando comecei a aprender Python, escrevi meu código desta forma:



for i in range(len(my_list)):
    print(i, my_list[i])
      
      





Funcionou, é claro. Mas esta não é uma solução no estilo Python. Alguns meses depois, aprendi a implementação padrão no estilo Python:



for i, v in enumerate(my_list):
    print(i, v)
      
      





Como podemos ver, a função embutida enumerate



torna nossa vida mais fácil.



Como evitar loops aninhados com a função Product



Os loops aninhados são uma verdadeira dor de cabeça. Eles podem reduzir a legibilidade do seu código e torná-lo mais difícil de entender. Por exemplo, interromper loops aninhados geralmente não é fácil de implementar. Precisamos saber onde o loop mais interno foi interrompido, o segundo loop interno mais alto e assim por diante.



Felizmente, Python tem uma incrível product



built-in função itertools



. Podemos usá-lo para evitar a gravação de muitos loops aninhados.



Vamos ver como isso é útil com um exemplo simples:



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, precisamos de três loops aninhados para obter três números de três listas, cuja soma é 2077. O código não é muito bonito.



Agora vamos tentar usar uma função 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, graças ao uso da função product



, basta um ciclo.



Como a função product



gera um produto direto dos dados iteráveis ​​de entrada, ela nos permite evitar loops aninhados em muitos casos.



Usando o módulo Itertools para escrever bons loops



Na verdade, uma função product



é apenas a ponta do iceberg. Se você aprender o módulo Python embutido itertools



, um novo mundo se abrirá diante de você. Esta caixa de ferramentas contém muitos métodos úteis para cobrir nossas necessidades de loop. Uma lista completa deles pode ser encontrada na documentação oficial . Vamos dar uma olhada em alguns exemplos.



Como criar um loop infinito



Existem pelo menos três maneiras de criar um loop infinito:



1. Usando uma função count



:



natural_num = itertools.count(1)
for n in natural_num:
    print(n)
# 1,2,3,...
      
      





2. Função cycle



:



many_yang = itertools.cycle('Yang')
for y in many_yang:
    print(y)
# 'Y','a','n','g','Y','a','n','g',...
      
      





3. Por meio da função repeat



:



many_yang = itertools.repeat('Yang')
for y in many_yang:
    print(y)
# 'Yang','Yang',...
      
      





Combinando vários iteradores em um



A função chain()



permite combinar vários iteradores em um.



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
      
      





Selecione os elementos duplicados adjacentes



A função é groupby



usada para selecionar elementos duplicados adjacentes em um iterador e juntá-los.



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']
      
      





Conforme mostrado acima, símbolos semelhantes adjacentes são conectados entre si. Além disso, podemos dizer à função groupby



como determinar a identidade de dois 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']
      
      





Customizando o ciclo



Depois de revisar os exemplos acima, vamos pensar sobre por que os loops for



Python são tão flexíveis e elegantes. Pelo que entendi, isso se deve ao fato de que podemos usar for



funções no iterador de loop . Em todos os exemplos acima, o iterador apenas usa funções especiais. Todos os truques têm o mesmo padrão:



for x in function(iterator)
      
      





O próprio módulo embutido itertools



implementa apenas as funções mais comuns para nós. Se esquecermos uma função ou não conseguirmos encontrar a que precisamos, podemos simplesmente escrevê-la nós mesmos. Para ser mais preciso, essas funções são geradores . É por isso que podemos gerar loops infinitos com eles.



Basicamente, podemos personalizar o loop for



como faríamos com um gerador personalizado.



Vamos dar uma olhada em um exemplo simples:



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 você pode ver no exemplo acima, definimos um gerador chamado even_only



. Se usarmos este gerador em um loop for, a iteração ocorrerá apenas para números pares da lista.



Claro, este exemplo é apenas para explicação. Existem outras maneiras de fazer a mesma coisa, como usar a visualização em 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
      
      





Resultado



A tarefa de criar loops em Python pode ser resolvida de maneira muito flexível e elegante. Para escrever loops convenientes e simples, podemos usar ferramentas integradas ou até mesmo definir geradores.






Propaganda



Servidor confiável para alugar , crie sua própria configuração em alguns cliques e comece a trabalhar em um minuto. Tudo funcionará perfeitamente e com um tempo de atividade muito alto!



Junte-se ao nosso chat do Telegram .






All Articles