Dominando a iteração: Tudo que você precisa saber sobre For em Python
- #Python
Introdução
Desbravando novos horizontes ao longo da sua épica jornada como programador, você com toda certeza aprendeu que existem estruturas feitas exclusivamente para guardar conjuntos de dados — como Listas, Dicionários e Tuplas — e suas minuciosas particularidades. Enquanto as estudava, é certo que surgiu a seguinte pergunta em sua mente: “Depois de colocar esses dados, como poderei usá-los depois?” e isso te trouxe até aqui. Pensando em como responder sua pergunta, os desenvolvedores do Python criaram o que chamamos de “Laço For”, que será o tema deste artigo.
Definição
Quando acessamos a seção sobre for na documentação oficial do Python, nos damos de cara com a seguinte explicação: “A instrução for é usada para iterar sobre os elementos de uma sequência (como uma string, tupla ou lista) ou outro objeto iterável”
Para que este enunciado fique mais claro, precisamos nos atentar a três conceitos simples:
- Tudo em Python é um objeto — Desde listas, strings, inteiros, booleans, funções, etc.
- Iteráveis são objetos que implementam o método __iter__ e, através da função built-in iter, conseguem retornar um objeto iterador, sem levantar a exceção TypeError.
- Iteradores implementam os métodos __iter__ — que retorna ele mesmo — e __next__() — que sempre fornece o próximo elemento da iteração.
Sabendo disso, podemos traduzir esta sentença para: “Todo objeto que possui o método __iter__ pode ser percorrido com a instrução for”. Portanto, utilizando esta estrutura de repetição, você, por exemplo, consegue passar por todos os dados inseridos numa lista e fazer o que bem entender com eles. Sugiro que pense em estruturas de repetição como ciclos dentro do seu código. No caso do for, a exceção StopIteration é levantada pelo método __next__() quando não há mais elementos para retornar, sinalizando que o ciclo terminou. Isso faz parte do mecanismo chamado “Iterator Protocol” e evita que ele continue infinitamente.
Estrutura
“Mas como posso utilizar isso no meu código, afinal?”
Afim de tornar a explicação mais palpável, vamos utilizar um exemplo simples: Imagine que você seja um estudante do fundamental e sua professora de matemática decide passar uma lista de números inteiros para que você calcule o resto da divisão deles por 2. Vejamos como faríamos isso em Python utilizando for:
listaDeNumeros = [2, 5, 7, 11, 20, 33]
for numero in listaDeNumeros: # percorra a lista de números
resto = numero % 2 # calcule o resto da divisão do número atual por 2
print(resto) # mostre o resto na tela
Seguindo a ideia de ciclos dentro do código apresentada anteriormente, criamos uma variável chamada "numero" para representar o valor em que estamos em cada um desses ciclos. Ou seja: em cada ciclo, nossa variável numero assume um valor da lista, nos dando a possibilidade de fazermos o que quisermos com esse valor. Com “for numero in listaDeNumeros:” estamos dizendo, objetivamente, que nossa variável assumirá cada valor, um por vez, ordenadamente, até o fim da lista — No nosso caso, a cada ciclo pegamos o resto da divisão do número atual por 2 e o mostramos na tela para o usuário. A saída será:
0
1
1
1
0
1
Também é perfeitamente possível utilizar um for dentro de outro. É muito comum fazermos isso para acessar dados dentro de matrizes, por exemplo:
matriz = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
for lista in matriz: # percorra a matriz
print(lista) # mostre a lista atual na tela
for numero in lista: # percorra a lista atual
print(numero) # mostre o número atual
Aqui, a cada lista que acessamos dentro da matriz, acessamos também seus valores e mostramos na tela para o usuário. A saída será assim:
[1, 2, 3]
1
2
3
[4, 5, 6]
4
5
6
[7, 8, 9]
7
8
9
Conclusão
Neste artigo, você aprendeu o que é o Laço For, como ele funciona por baixo dos panos — através do “Iterator Protocol” — e como utilizá-lo no seu código. Esta é uma ferramenta poderosíssima que possibilita a criação de diversos algoritmos — seja simples ou complexo — de maneira legível e extremamente prática. Caso você tenha interesse em se aprofundar um pouco mais em alguma das coisas que citei neste artigo, abaixo estão as fontes que me baseei para escrevê-lo:
Documentação oficial do Python: Seção sobre o For
Iterators and Iterables in Python: Run Efficient Iterations