Como obter um valor de cada vez de uma função de gerador em Python?

113

Pergunta muito básica - como obter um valor de um gerador em Python?

Até agora descobri que posso conseguir um escrevendo gen.next(). Só quero ter certeza de que esse é o caminho certo.

bodacydo
fonte

Respostas:

154

Sim, ou next(gen)em 2.6+.

Ignacio Vazquez-Abrams
fonte
3
Eu sei que isso é constrangedor, por que isso não funciona? W1 = params.next()mas recebo um erroAttributeError: 'generator' object has no attribute 'next'
Charlie Parker
2
@CharlieParker Você deve estar usando Python 3!
Akshay Lokur
66

Em Python <= 2.5, use gen.next(). Isso funcionará para todas as versões do Python 2.x, mas não para o Python 3.x

Em Python> = 2.6, use next(gen). Esta é uma função incorporada e é mais clara. Também funcionará no Python 3.

Ambos acabam chamando uma função especialmente nomeada next(), que pode ser substituída por uma subclasse. No Python 3, no entanto, essa função foi renomeada para __next__(), para ser consistente com outras funções especiais.

Christian Oudard
fonte
16

Use (para python 3)

next(generator)

Aqui está um exemplo

def fun(x):
    n = 0
    while n < x:
        yield n
        n += 1
z = fun(10)
next(z)
next(z)

deve imprimir

0
1
dshri
fonte
2

Para obter o valor associado a um objeto gerador em python 3 e superior, use next(<your generator object>). chamadas subsequentes para next () produzem valores de objeto sucessivos na fila.

Ryukendo Dey
fonte
1

No python 3 você não tem gen.next(), mas ainda pode usar next(gen). Um pouco bizarro, se você me perguntar, mas é assim que é.

Niki.py
fonte
1
Não é tão estranho. Supõe-se que o Python 3 quebra as coisas e permite apenas códigos melhores e mais claros. Não ter compatibilidade com versões anteriores é o ponto de algumas mudanças importantes.
Tatarize de