Comprendre les générateurs et la fonction next en Python
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
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 !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte