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 .