Résolue

Comprendre les générateurs et la fonction next en Python

# Itérateurs # Générateurs

Bonsoir,
J'ai du mal avec la notion d'itérateur et la fonction next même avec les IA ça le fait pas, surtout combiné à quelque chose comme ça :

(i for i in [10, 20, 30] if i > 15)

Je ne comprends pas ce que fait cette ligne :

valeur = next((i for i in [10, 20, 30] if i > 15), None)

Je ne comprends ni le next, ni la nature de l'objet qui résulte de (i for i in [10, 20, 30] if i > 15).

Merci d'avance

Gabriel Trouvé

Mentor

Salut Yanis,

On est vite confus avec les expressions génératrices du genre ^^

Premier cas

(i for i in [10, 20, 30] if i > 15)
Ici Python ne va pas faire comme une liste, c'est-à -dire te calculer toutes les valeurs. Enfin ... tu pourrais le faire mais tu ferais ça :
list(i for i in [10, 20, 30] if i > 15)

Les valeurs seront générées une par une quand tu en aurais besoin. Par exemple quand tu feras :

for i in (i for i in [10, 20, 30] if i > 15):
    print(i)

Donc imagine une liste avec des millions d'éléments, tu aurais peut-être plutôt intérêt à faire une expression génératrice :)

C'est pas mal utilisé avec any et all.

Donc pour résumer, tu as une expression génératrice => generator object <genexpr>

next

next(iterator) va parcourir l'itérateur (un générateur est un itérateur)

from typing import Iterator

gen_expr = type((i for i in [10, 20, 30] if i > 15))


print(issubclass(gen_expr, Iterator))

next permet de demander la valeur suivante de ton itérateur, et lève une erreur si tu as épuisé toutes les valeurs :

mon_expression = (i for i in [10, 20, 30] if i > 15)

print(next(mon_expression)) # 20
print(next(mon_expression)) # 30
print(next(mon_expression)) # StopIteration

Donc next peut prendre une valeur par défaut en deuxième argument :

mon_expression_bis = (i for i in [10, 20, 30] if i > 15)

print(next(mon_expression_bis, None)) # 20
print(next(mon_expression_bis, None)) # 30
print(next(mon_expression_bis, None)) # None

Donc si le générateur est épuisé, tu n'auras pas d'erreur mais next te renvoie None :)

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.