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:
1def infinite_numbers():
2 i = 0
3 while True:
4 yield i
5 i += 1
6
7for number in infinite_numbers():
8 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:
1def even_numbers(n):
2 for i in range(n):
3 if i % 2 == 0:
4 yield i
5
6def odd_numbers(n):
7 for i in range(n):
8 if i % 2 != 0:
9 yield i
10
11
12def all_numbers(n):
13 yield from even_numbers(n)
14 yield from odd_numbers(n)
15
16
17for number in all_numbers(10):
18 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_numbersrodar para sempre, entãoall_numbersnunca 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:
1def all_numbers(n):
2 for number in even_numbers(n):
3 yield number
4 for number in odd_numbers(n):
5 yield number
Com a keyword yield from, o código fica mais limpo e fácil de ler.
E é isso! Espero ter ajudado! :)