Iteráveis e iteradores em Python
Em Python, iteráveis e iteradores são conceitos intimamente relacionados e facilmente confundidos. Ambos são usados para realizar loop em coleções de dados. Porém, existe uma distinção fundamental entre eles. E essa distinção conta com vantagens adicionais.
A diferença entre iteráveis e iteradores
Um iterável é um objeto que contém um conjunto iterável de valores que você pode iterar. Ou seja, um iterável pode ser usado em um loop for para acessar seus elementos um de cada vez. Exemplos de iteráveis em Python incluem listas, tuplas, strings, dicionários (para chaves) e sets.
Um iterador é um objeto que controla sua posição em um iterável e permite que você acesse elementos um de cada vez usando o método next(). Portanto, um iterador opera como um apontador que se move pelo iterável, retornando o próximo elemento cada vez que o método next() é chamado. Você pode obter um iterador de um iterável usando a função interna do Python iter().
Em Python, todo iterador é também um iterável porque pode ser passado para iter() e retornar a si. Nem todos os iteráveis são iteradores por si só. Por exemplo, uma string é iterável, mas uma string não é um iterador. Mas iteráveis são convertíveis em iteradores e isso tem vantagens. Vamos a elas.
Quais são as vantagens de usar iteradores ao invés de iteráveis?
A maior vantagem para usar iteradores no lugar de iteráveis é a eficiência da memória. Os iteradores processam elementos sob demanda, um de cada vez. Isso é particularmente útil ao lidar com grandes conjuntos de dados ou sequências infinitas (como ler linhas de um arquivo enorme). Com iteráveis como listas, todos os elementos são armazenados na memória antecipadamente, o que pode ser um desperdício se você precisar processar apenas um subconjunto ou não tiver memória suficiente para toda a coleção. Outra vantagem é que os iteradores permitem uma avaliação preguiçosa. Ou seja, seus elementos não são gerados ou calculados até que sejam realmente necessários no loop. Isso pode ser útil para operações complexas em que a criação de elementos pode ser computacionalmente cara.
De iterável a iterador em código
Sabemos que uma string é iterável, mas não é um iterador. Como consequência, como ilustrado no exemplo abaixo, se tentarmos usar o método next() com uma string, obtemos um erro:
next("exemplo")
# TypeError: 'str' object is not an iterator
Mas um iterável como a string do exemplo acima pode ser facilmente transformada em um iterador com o método iter(). No exemplo ilustrativo abaixo, o método iter() converte a string (iterável) em um iterador e imprime suas letras uma a uma conforme o método next() é chamado.
minha_string="exemplo"
minha_string=iter(minha_string) # converte string em iterador
print(next(minha_string)) # resultado: e
print(next(minha_string)) # resultado: x
print(next(minha_string)) # resultado: e
print(next(minha_string)) # resultado: m
print(next(minha_string)) # resultado: p
A mesma operação pode ser realizada com listas ou outros iteráveis do Python. Veja abaixo um pequeno exemplo:
cidades = ["Fortaleza", "Rio de Janeiro", "Belo Horizonte"]
iterator_obj = iter(cidades) # converte lista em iterador
print(next(iterator_obj)) # Resultado: Fortaleza
print(next(iterator_obj)) # Resultado: Rio de Janeiro
print(next(iterator_obj)) # Resultado: Belo Horizonte
Com essa transformação simples, iteráveis como lista e strings se tornam objetos mais eficientes em Python.
Veja também:
Encontrou algum erro ou quer fazer uma sugestão? Por favor, entre em contato usando nosso formulário de contatos.