Saiba como esse tipo de função alternativa pode ajudar a reduzir o consumo de memória.

Se você estiver lendo linhas de um arquivo de log ou processando uma longa lista de itens, uma opção é carregar todos os dados na memória. No entanto, essa abordagem pode usar muita memória e prejudicar o desempenho. Os geradores oferecem uma solução valiosa.

Os geradores eliminam a necessidade de carregar todos os dados na memória simultaneamente. Eles são úteis ao lidar com grandes conjuntos de dados, sequências infinitas ou qualquer cenário onde a eficiência da memória seja fundamental.

O que são geradores?

Um gerador é uma função especial que permite iterar uma sequência de valores. Em vez de retornar um conjunto completo de dados, eles geram — ou produzem — um valor por vez. Isso os torna eficientes para trabalhar com sequências de dados grandes ou ilimitadas.

A função Python regular normalmente calcula um valor e o retorna. Mas os geradores operam de maneira diferente. Eles podem gerar vários valores ao longo do tempo, pausando e retomando a execução entre cada produção.

A principal distinção entre funções regulares e geradores é que em vez de usar o retornar palavra-chave para produzir um resultado, os geradores usam colheita.

Como criar um gerador

Para criar um gerador, em vez do retornar declaração, use um colheita instrução dentro da função. O colheita A palavra-chave não apenas instrui a função a retornar um valor, mas também permite que ela salve seu estado, permitindo uma retomada futura.

Aqui está um exemplo de uma função geradora simples:

defnumeric_generator():
yield1
yield2
yield3

gen = numeric_generator()

Esta função geradora produz valores numéricos de 1 a 3.

O colheita A instrução salva o estado da função, preservando as variáveis ​​locais entre as chamadas, para continuar quando você solicitar o próximo valor.

Atribuir uma função geradora a uma variável cria um objeto gerador com o qual você pode trabalhar.

Trabalhando com geradores

Os geradores têm múltiplas aplicações. Você pode usá-los em loops ou dentro das compreensões da lista, bem como outras estruturas iteráveis. Os geradores também podem servir como argumentos para funções.

Depois de criar um gerador, você pode iterá-lo usando um loop for:

for i in numeric_generator():
print(i)

Você também pode usar o próximo função para recuperar valores um por um:

print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3

Isso lhe dá mais controle sobre o objeto gerador.

Os geradores podem acompanhar seu estado. Cada declaração de rendimento em uma função atua como um ponto de verificação. Quando você liga para o próximo() função no objeto gerador, a execução continua a partir do ponto de rendimento anterior.

Você também pode passar valores para um gerador usando enviar():

defgenerator_with_send():
# First yield: Receive a value
x = yield
print(f"Received: {x}")

# Second yield: Receive another value
y = yield
print(f"Received: {y}")

# Third yield: Yield the sum
yield x + y

gen = generator_with_send()

# Start generator and reach first yield
next(gen)

# Send 10 into generator, received at first yield
result = gen.send(10)

# Send 5 into generator, received at second yield
result = gen.send(5)

# Print result of third yield
print(result)

O enviar() O método permite recuperar valores do gerador e enviar valores de volta para a função do gerador, pausando-o efetivamente e permitindo controlar sua execução. O enviar() O método é útil ao escrever corrotinas ou usar geradores para fins avançados.

Usando Expressões Geradoras

As expressões geradoras fornecem uma maneira concisa de criar um gerador simples e anônimo. Eles são semelhantes às compreensões de lista, mas usam parênteses em vez de colchetes.

Aqui está um exemplo:

gen = (i**2for i in range(10))

for x in gen:
print(x)

O código cria uma expressão geradora que produz os quadrados dos números de 0 a 9. Expressões geradoras são ideais para gerar preguiçosamente uma sequência de valores.

Usando Geradores para Processamento de Dados

Os geradores Python são uma maneira conveniente de descrever fluxos de dados e construir iteradores sem manter tudo na memória. Você pode melhorar significativamente sua programação aprendendo a usar geradores, tornando mais fácil lidar com tarefas desafiadoras de processamento de dados.

Na próxima vez que você trabalhar com grandes conjuntos de dados, lembre-se dos geradores e delegue a eles as tarefas trabalhosas, para que seu código permaneça responsivo e eficiente.