Vous ne pouvez pas inverser un générateur de manière générique, sauf en le transformant en une séquence et en créant un itérateur à partir de cela. Les termes ultérieurs d'un générateur ne peuvent pas nécessairement être connus avant que les termes antérieurs aient été calculés.
Pire encore, vous ne pouvez pas savoir si votre générateur atteindra jamais une exception StopIteration tant que vous ne l'avez pas touché, il n'y a donc aucun moyen de savoir quel sera le premier terme de votre séquence.
Le mieux que vous pourriez faire serait d'écrire une fonction reversed_iterator:
def reversed_iterator(iter):
return reversed(list(iter))
EDIT: Vous pouvez aussi, bien sûr, remplaçons inversé dans ce avec votre imap base version itérative, pour sauver une création de la liste.
Je dois prendre l'exception avec votre exemple d'inverser une séquence. Pourquoi ne pas simplement utiliser 'reverse'? ou '.reverse'? Même 'seq [:: - 1]' est plus clair que ce que vous avez écrit. –
Parce que tous ces exemples vont créer une nouvelle liste. Mon exemple ci-dessus est la seule façon que je connaisse de créer une liste sans la copier d'abord. –
Eh bien, j'ai appris quelque chose de nouveau - seq [:: - 1] * fait * en fait créer une nouvelle liste. Voir ma réponse d'expression de générateur pour une alternative en utilisant des indices négatifs. – PaulMcG