Index et Tranche un Générateur en Python
Permet de dire que j'ai un générateur de fonction qui ressemble à ceci:
def fib():
x,y = 1,1
while True:
x, y = y, x+y
yield x
Idéalement, je pouvais fib()[10] ou fib()[2:12:2] pour obtenir des indices et des tranches, mais actuellement, je utiliser itertools pour ces choses. Je ne peux pas utiliser un générateur pour une baisse de remplacement pour les listes.
Je crois que la solution sera de les envelopper fib() dans une classe:
class Indexable(object):
....
fib_seq = Indexable(fib())
Ce qui devrait Indexables ressembler pour faire ce travail?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez l'utiliser comme ceci:
Avis que
it[2:12:2]
ne retourne pas[3, 8, 21, 55, 144]
depuis l'itérateur avait déjà avancé de 11 éléments, en raison de l'appel àit[10]
.Edit: Si vous souhaitez
it[2:12:2]
de retour[3, 8, 21, 55, 144]
alors peut-être utiliser ce lieu:Cette version enregistre les résultats dans
self.already_computed
, et utilise ces résultatssi cela est possible. Sinon, il calcule plus de résultats jusqu'à ce qu'il a suffisamment nombreux
de retour de l'indexation de l'élément ou de la tranche.
__getitem__
tirer les numéros directement à partir de la liste, après la première faire avancer le générateur si nécessaire.Donc basé sur le code de la ~unutbu et en ajoutant un peu de itertools.tee shirt:
already_computed
le temps CPU nécessaire ici est susceptible d'être excessif de trop.Si c'est un 1-utilisation de la tranche que vous pouvez simplement utiliser la méthode écrite par ~unutbu. Si vous devez couper plusieurs fois vous devez stocker toutes les valeurs intermédiaires de sorte que vous pouvez "rewind", l'itérateur. Depuis les itérateurs peut itérer tout ce qu'il n'aurait pas un rembobinage de la méthode par défaut.
Aussi, depuis un rembobinage itérateur doit stocker tous les résultats intermédiaires, il serait (dans la plupart des cas) n'ont aucun avantage, par rapport à tout simplement faire
list(iterator)
Essentiellement... soit vous n'avez pas besoin d'un itérateur, ou vous n'êtes pas assez précis sur la situation.
list(fib())
vous donnera un MemoryError finalementIci est de ~unutbu de la réponse modifiée à la sous-classe de la liste. Évidemment, les abus tels que
append
,insert
etc. va produire des résultats bizarres!vous obtenez
__str__
et__repr__
méthodes pour gratuit siÀ la tranche générateur vous pouvez utiliser
islice
fonction deitertools