A palavra-chave yield em Python
Este tutorial explicará o propósito e o uso da palavra-chave yield
em Python. A palavra-chave yield
é uma instrução Python usada para definir as funções geradoras em Python. A instrução yield
só pode ser usada dentro do corpo da função.
A principal diferença entre uma função geradora e uma função regular é que a função geradora contém uma expressão yield
em vez da instrução return
. A instrução yield
produz a série de valores denominada iterador gerador como saída. Novos valores do iterador podem ser recuperados usando a função next()
ou o loop for
.
Cada vez que a função next()
é chamada ou a cada iteração do loop for
, a instrução yield
produz ou produz um novo valor e salva o estado de execução da função, ou seja, os valores das variáveis locais, etc. Em cada nova chamada de função next()
ou iteração, a instrução yield
é retomada do último estado salvo, ao contrário da instrução return
que começa em cada chamada.
Códigos de exemplo da palavra-chave yield
em Python
Como o funcionamento da instrução yield
é claro, vamos agora dar uma olhada em seus usos e códigos de exemplo. Suponha que temos uma grande quantidade de dados e eles não podem ser carregados de uma vez em um objeto iterável, ou queremos uma maneira mais eficiente de memória para ler os dados. Podemos criar uma função geradora usando a declaração de rendimento; a função lerá e produzirá o novo bloco de dados a cada iteração ou chamada de função next()
.
O código de exemplo a seguir demonstra como usar a instrução yield
com o loop for
para criar uma função geradora simples em Python. A função do gerador my_generator()
no código de exemplo a seguir produzirá o novo número de 1
a 100
e funcionará até 99
chamadas.
def my_generator():
for x in range(1, 100):
print("new value is generated!")
yield x
Precisamos primeiro de um objeto iterador gerador para gerar valores usando a função next()
ou por meio de iteração.
gen_iter = my_generator()
Agora vamos obter os novos valores do iterador gerador usando a função next()
; também podemos usar a função next()
como iterator.__next__()
, conforme mostrado no código de exemplo abaixo.
val = next(gen_iter)
print("Value =", val)
val = gen_iter.__next__()
print("Value =", val)
Resultado:
new value is generated!
Value = 1
new value is generated!
Value = 2
O outro método para obter novos valores é iterar por meio do objeto iterador gerador usando o loop for
; o código de exemplo a seguir demonstra como iterar por meio do objeto gerador de iterador em Python.
for val in gen_iter:
print("Value =", val)
O exemplo de código acima irá gerar todos os valores 99
do intervalo especificado na função do gerador.
Também podemos criar uma função geradora sem o loop for
usando a instrução yield
várias vezes, conforme demonstrado no código de exemplo abaixo.
def my_generator():
x = 1
print("new value is generated!")
yield x
x = x + 1
print("new value is generated!")
yield x
x = x + 1
print("new value is generated!")
yield x
Agora, vamos usar nossa nova função de gerador para gerar todos os valores usando o loop for
.
gen_iter = my_generator()
for val in gen_iter:
print("Value =", val)
Resultado:
new value is generated!
Value = 1
new value is generated!
Value = 2
new value is generated!
Value = 3