Funções Geradoras

Em Python, funções geradoras são uma maneira poderosa de criar iteradores de forma eficiente. Elas nos permitem gerar valores de maneira sob demanda, economizando memória e recursos do sistema. Neste tutorial, vamos explorar o conceito de funções geradoras, entender como elas funcionam e aprender como criar e usar geradores em Python.

1. O Que São Funções Geradoras?

Funções geradoras são funções especiais que utilizam a palavra-chave yield em vez de return para retornar valores. Quando uma função geradora é chamada, ela retorna um objeto gerador, que pode ser iterado para obter valores um de cada vez, economizando memória ao não armazenar todos os valores na memória de uma vez.

2. Criando uma Função Geradora Simples:

Vamos criar uma função geradora que gera números pares de 0 a N:

def numeros_pares(n):
    i = 0
    while i <= n:
        if i % 2 == 0:
            yield i
        i += 1

gerador = numeros_pares(10)
for numero in gerador:
    print(numero)  # Saída: 0, 2, 4, 6, 8, 10

Neste exemplo, a função numeros_pares() é uma função geradora que retorna números pares até o valor de n.

3. Vantagens das Funções Geradoras:

  • Eficiência de Memória: As funções geradoras produzem valores sob demanda, economizando memória ao não armazenar a lista completa de valores.
  • Desempenho: A geração sob demanda pode ser mais rápida, especialmente para grandes conjuntos de dados, pois não precisa calcular ou buscar todos os valores de uma vez.

4. Usando Expressões Geradoras:

Além de funções geradoras, Python também suporta expressões geradoras. Elas seguem uma sintaxe semelhante às listas de compreensão, mas usam parênteses em vez de colchetes.

gerador = (x**2 for x in range(5))
for numero in gerador:
    print(numero)  # Saída: 0, 1, 4, 9, 16

Neste exemplo, uma expressão geradora é usada para gerar os quadrados dos números de 0 a 4.

As funções geradoras são uma maneira eficiente e elegante de criar iteradores em Python. Elas são especialmente úteis ao lidar com grandes conjuntos de dados ou operações que podem ser realizadas sequencialmente. Ao utilizar funções geradoras, você pode economizar memória e melhorar o desempenho do seu código, tornando-o mais eficiente e escalável.