Imagine tu dois traiter 1 milliard de lignes d'un fichier.
Si tu fais lignes = fichier.readlines(), tu charges TOUT en mémoire. Ton PC explose (Memory Error).
La solution : Les Générateurs.
Au lieu de renvoyer toute la liste (return), la fonction renvoie un élément à la fois (yield) et se met en pause.
def generateur_infini():
n = 0
while True:
yield n
n += 1
gen = generateur_infini()
print(next(gen)) # 0
print(next(gen)) # 1
# Et ainsi de suite...
C'est ce que fait range(). Il ne crée pas une liste de 1 million de nombres en mémoire. Il te les donne un par un quand tu demandes.
Le mot-clé yield
Dès que Python voit yield dans une fonction, il sait que c'est un générateur.