Usando Return e Yield juntos em geradores Python
No Python 2, uma instrução return dentro de uma função geradora que também usasse yield resultaria em um erro. No entanto, no Python 3.3, ocorreu uma mudança sutil.
Demonstração de código
Considere o seguinte código do Python 3.3:
def f():
return 3
yield 2
x = f()
print(x.__next__())
Explicação
Neste código, a função f inclui uma instrução de retorno e uma instrução de rendimento. Quando a função é chamada, a instrução return é executada primeiro e o valor 3 é retornado. Como resultado, a instrução yield não é executada.
Quando o gerador x é iterado chamando seu método next, uma exceção StopIteration é gerada com um valor de 3. Isso significa que o o iterador do gerador está esgotado e o valor retornado pela instrução return está disponível como o atributo de valor da exceção.
Novo mecanismo em Python 3.3
De acordo com PEP 380 , esse comportamento é um novo recurso introduzido no Python 3.3. É equivalente a escrever:
def f():
yield 3
raise StopIteration
Exemplo com Yield from
O exemplo a seguir demonstra como esse comportamento afeta geradores delegados usando a sintaxe yield from:
def f():
return 1
yield 2
def g():
x = yield from f()
print(x)
# g is still a generator so we need to iterate to run it:
for _ in g():
pass
Neste caso, o rendimento da instrução delega ao gerador f. Como f retorna um valor, mas não possui mais declarações de rendimento, o valor 1 é impresso. No entanto, a instrução yield 2 em f não é executada.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3