"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como o retorno e o rendimento funcionam juntos em geradores Python 3.3?

Como o retorno e o rendimento funcionam juntos em geradores Python 3.3?

Publicado em 01/11/2024
Navegar:479

How Do Return and Yield Work Together in Python 3.3 Generators?

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.

Declaração de lançamento Este artigo foi reimpresso em: 1729747611 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

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