Comment obtenir une valeur à la fois à partir d'une fonction de générateur en Python?

113

Question très basique - comment obtenir une valeur d'un générateur en Python?

Jusqu'à présent, j'ai trouvé que je pouvais en obtenir un en écrivant gen.next(). Je veux juste m'assurer que c'est la bonne manière?

Bodacydo
la source

Réponses:

154

Oui, ou next(gen)dans 2.6+.

Ignacio Vazquez-Abrams
la source
3
Je sais que c'est embarrassant de savoir pourquoi cela ne fonctionne pas? W1 = params.next()mais obtenez une erreurAttributeError: 'generator' object has no attribute 'next'
Charlie Parker
2
@CharlieParker Vous devez utiliser Python 3!
Akshay Lokur
66

En Python <= 2.5, utilisez gen.next(). Cela fonctionnera pour toutes les versions de Python 2.x, mais pas pour Python 3.x

En Python> = 2.6, utilisez next(gen). C'est une fonction intégrée, et c'est plus clair. Cela fonctionnera également en Python 3.

Les deux finissent par appeler une fonction spécialement nommée next(), qui peut être remplacée par le sous-classement. Dans Python 3, cependant, cette fonction a été renommée en __next__(), pour être cohérente avec d'autres fonctions spéciales.

Christian Oudard
la source
16

Utiliser (pour python 3)

next(generator)

Voici un exemple

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

devrait imprimer

0
1
dshri
la source
2

Pour obtenir la valeur associée à un objet générateur en python 3 et supérieur, utilisez next(<your generator object>). les appels suivants à next () produisent des valeurs d'objet successives dans la file d'attente.

Ryukendo Dey
la source
1

En python 3, vous n'avez pas gen.next(), mais vous pouvez toujours utiliser next(gen). Un peu bizarre si vous me demandez mais c'est comme ça.

Niki.py
la source
1
Ce n'est pas si étrange. Python 3 est censé casser les choses et n'autoriser que le meilleur code plus clair. Ne pas avoir de compatibilité descendante est le point de quelques changements de rupture.
Tatarize le