O que é yield e yield from em Python (#dev #python)

O que é yield e yield from em 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_numbers rodar para sempre, então all_numbers nunca executará o generator odd_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! :)

Traduções: