Em Python, iteradores e geradores são ferramentas poderosas para trabalhar com sequências de dados. Eles permitem iterar os dados sem precisar armazenar a sequência inteira na memória. Este blog irá explicar iteradores e geradores de uma forma simples e compreensível, com exemplos práticos.
Definição: Um iterador é um objeto em Python que permite percorrer todos os elementos de uma coleção (como uma lista ou uma tupla), um de cada vez. Segue o protocolo iterador, que inclui a implementação de dois métodos: __iter__() e __next__().
Como funcionam os iteradores:
__iter__(): Este método retorna o próprio objeto iterador.
__next__(): Este método retorna o próximo valor da coleção. Se não houver mais itens para retornar, a exceção StopIteration será gerada.
Exemplo de um iterador personalizado:
class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.indexSaída:
1 2 3Explicação: Neste exemplo, MyIterator é uma classe iteradora personalizada que itera em uma lista de números. O método __next__() retorna o próximo item da lista e gera StopIteration quando não há mais itens para retornar.
Iteradores padrão para coleções integradas
Python fornece iteradores padrão para coleções integradas, como listas, tuplas, dicionários e conjuntos. Você pode usar a função iter para obter um iterador dessas coleções e então usar next para iterar por elas.
Exemplo com uma lista:
my_list = [1, 2, 3] my_iter = iter(my_list) print(next(my_iter)) # Output: 1 print(next(my_iter)) # Output: 2 print(next(my_iter)) # Output: 3 # print(next(my_iter)) # This will raise StopIteration2. O que é um gerador?
Definição: Um gerador é um tipo especial de iterador em Python, definido usando uma função e a palavra-chave yield. Os geradores permitem que você itere por uma sequência de valores sem armazená-los todos na memória de uma só vez, tornando-os mais eficientes em termos de memória do que listas.
Como funcionam os geradores:
Exemplo:
def my_generator(): yield 1 yield 2 yield 3 gen = my_generator() for item in gen: print(item)
Saída:
1 2 3
Explicação: Neste exemplo, my_generator é uma função geradora que produz três valores, um por um. Cada chamada para yield produz um valor e pausa a função até que o próximo valor seja solicitado.
Eficiência de memória: Os geradores geram valores dinamicamente e não armazenam a sequência inteira na memória, tornando-os ideais para trabalhar com grandes conjuntos de dados ou fluxos de dados.
Exemplo:
def large_sequence(): for i in range(1, 1000001): yield i gen = large_sequence() print(next(gen)) # Output: 1 print(next(gen)) # Output: 2
Explicação: Este gerador produz uma sequência de um milhão de números sem armazená-los todos na memória, demonstrando sua eficiência de memória.
Iteradores:
Objetos iteráveis personalizados: quando você precisa de mais controle sobre a lógica de iteração.
Sequências infinitas: geração de uma sequência infinita de valores, como dados de um sensor.
Geradores:
Avaliação preguiçosa: processamento de grandes conjuntos de dados, um item por vez.
Pipelines: criação de pipelines de processamento de dados que lidam com dados em streaming.
Definição: As expressões geradoras fornecem uma maneira concisa de criar geradores. Eles são semelhantes às compreensões de lista, mas usam parênteses em vez de colchetes.
Exemplo:
gen_exp = (x * x for x in range(5)) for value in gen_exp: print(value)
Saída:
0 1 4 9 16
Explicação: Esta expressão geradora cria um gerador que produz os quadrados dos números de 0 a 4.
Exemplo 1: leitura de arquivos grandes
def read_large_file(file_path): with open(file_path, 'r') as file: for line in file: yield line for line in read_large_file('large_file.txt'): print(line.strip())
Explicação: Esta função geradora lê um arquivo grande linha por linha, produzindo uma linha por vez. É eficiente em termos de memória porque não carrega o arquivo inteiro na memória.
Exemplo 2: Sequência de Fibonacci
def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a b fib = fibonacci() for _ in range(10): print(next(fib))
Saída:
0 1 1 2 3 5 8 13 21 34
Explicação: Esta função geradora produz uma sequência infinita de números de Fibonacci. Ele demonstra como geradores podem ser usados para gerar sequências de valores potencialmente infinitas.
* An iterator is an object that allows you to traverse through all the elements of a collection one at a time, implementing the `__iter__()` and `__next__()` methods.
* A generator is a special type of iterator defined using a function and the `yield` keyword, allowing you to generate values on the fly without storing them all in memory.
* Generators are memory-efficient, as they generate values on the fly. They are useful for processing large datasets, building data pipelines, and working with potentially infinite sequences.
* Generator expressions use parentheses and produce values one at a time, whereas list comprehensions use square brackets and generate the entire list in memory.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3