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:

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ã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:

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! :)

Traduções: