Funções Geradoras
Uma função geradora é um tipo especial de função que utiliza a palavra-chave yield em vez de return para gerar uma sequência de valores. Quando uma função geradora é chamada, ela retorna um objeto iterador, que pode ser percorrido para recuperar valores um de cada vez.
Um objeto iterador é um objeto que implementa o protocolo de iteração definindo os métodos __iter__() e __next__(). Isso permite recuperar elementos um de cada vez com next(), possibilitando percorrer itens em sequências ou funções geradoras.
A principal vantagem das funções geradoras é a sua eficiência de memória. Em vez de gerar toda a sequência antecipadamente e armazená-la na memória, os geradores produzem valores sob demanda conforme necessário.
Como o yield Funciona
Diferente do return, que encerra completamente a função, yield pausa a função e salva seu estado. Na próxima vez que next() for chamado, o gerador retoma exatamente de onde parou:
12345678910def count_up(start, stop): while start <= stop: yield start # Pause and return the current value start += 1 # Resume from here on the next call counter = count_up(1, 3) print(next(counter)) # 1 print(next(counter)) # 2 print(next(counter)) # 3
Também é possível iterar sobre um gerador usando um loop for – ele chama automaticamente next() até que o gerador seja esgotado:
1234567def count_up(start, stop): while start <= stop: yield start start += 1 for value in count_up(1, 5): print(value) # 1, 2, 3, 4, 5
Quando um gerador é esgotado (não há mais valores para gerar), chamar next() nele irá lançar uma exceção StopIteration. Um loop for lida com isso automaticamente.
Obrigado pelo seu feedback!
single
Funções Geradoras
Deslize para mostrar o menu
Uma função geradora é um tipo especial de função que utiliza a palavra-chave yield em vez de return para gerar uma sequência de valores. Quando uma função geradora é chamada, ela retorna um objeto iterador, que pode ser percorrido para recuperar valores um de cada vez.
Um objeto iterador é um objeto que implementa o protocolo de iteração definindo os métodos __iter__() e __next__(). Isso permite recuperar elementos um de cada vez com next(), possibilitando percorrer itens em sequências ou funções geradoras.
A principal vantagem das funções geradoras é a sua eficiência de memória. Em vez de gerar toda a sequência antecipadamente e armazená-la na memória, os geradores produzem valores sob demanda conforme necessário.
Como o yield Funciona
Diferente do return, que encerra completamente a função, yield pausa a função e salva seu estado. Na próxima vez que next() for chamado, o gerador retoma exatamente de onde parou:
12345678910def count_up(start, stop): while start <= stop: yield start # Pause and return the current value start += 1 # Resume from here on the next call counter = count_up(1, 3) print(next(counter)) # 1 print(next(counter)) # 2 print(next(counter)) # 3
Também é possível iterar sobre um gerador usando um loop for – ele chama automaticamente next() até que o gerador seja esgotado:
1234567def count_up(start, stop): while start <= stop: yield start start += 1 for value in count_up(1, 5): print(value) # 1, 2, 3, 4, 5
Quando um gerador é esgotado (não há mais valores para gerar), chamar next() nele irá lançar uma exceção StopIteration. Um loop for lida com isso automaticamente.
Deslize para começar a programar
Implemente uma função geradora even_numbers que produza números pares em um determinado intervalo.
- Defina uma função geradora
even_numbersque receba dois parâmetros:startestop. - Utilize um laço
whilepara iterar enquantostartfor menor ou igual astop. - Utilize
yieldpara retornarstartapenas se ele for par (divisível por 2). - Incremente
startem 1 após cada iteração. - Utilize um laço
forpara exibir todos os valores gerados.
Solução
Obrigado pelo seu feedback!
single
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo