O que é yield e yield from em Python (#dev #python)
Overview
Neste post, falaremos sobre as palavras-chave yield
e yield from
em Python. Veremos como elas funcionam e como você pode
usá-las para criar generators.
O que é yield em Python?
Bom, é basicamente a mesma coisa que em C# ou outras linguagens de programação…
Música tema da Praça é Nossa começa a tocar!
Brincadeira… 😂 Esta keyword em Python é usada para criar um generator, que falamos em detalhes aqui.
Para lembrar:
def infinite_numbers():
i = 0
while True:
yield i
i += 1
for number in infinite_numbers():
print(number)
No exemplo acima, estamos criando um generator que retornará um número infinito de inteiros.
A palavra-chave yield
é usada para retornar um valor do generator, e ela pausará a execução do generator até
a próxima vez que for chamada.
E o que é yield from?
É quase a mesma coisa, mas você pode usá-la para delegar o yield para outro generator.
Exemplo:
def even_numbers(n):
for i in range(n):
if i % 2 == 0:
yield i
def odd_numbers(n):
for i in range(n):
if i % 2 != 0:
yield i
def all_numbers(n):
yield from even_numbers(n)
yield from odd_numbers(n)
for number in all_numbers(10):
print(number)
No exemplo acima, temos três generators: even_numbers
, odd_numbers
e all_numbers
.
O generator all_numbers
usa a keyword yield from
para delegar o yield para os generators even_numbers
Observação: Se
even_numbers
rodar para sempre, entãoall_numbers
nunca executará o generatorodd_numbers
.
Se você precisar de mais controle sobre a execução dos generators, você pode tentar usar o zip
e iterar sobre ambos
os generators ou usar o método next
para iterar manualmente sobre os generators. No entanto, se você só quer retornar
os valores de cada generator, yield from
pode ser a solução.
Sem ela, teríamos que iterar sobre os generators even_numbers
e odd_numbers
. Por exemplo:
def all_numbers(n):
for number in even_numbers(n):
yield number
for number in odd_numbers(n):
yield number
Com a keyword yield from
, o código fica mais limpo e fácil de ler.
E é isso! Espero ter ajudado! :)