Il existe un paquet fantastique en Python appelé itertools
.
Mais avant d'entrer dans le vif du sujet, il serait bon d'expliquer comment le protocole d'itération est implémenté en Python. Lorsque vous souhaitez fournir une itération sur votre conteneur, vous spécifiez l'attribut __iter__()
qui fournit une méthode de classe type d'itérateur . "Comprendre l'instruction 'for' de Python" est un bon article qui explique comment le for-in
fonctionne réellement en Python et fournit un bon aperçu du fonctionnement des types d'itérateurs.
Jetez un coup d'œil à ce qui suit :
>>> sequence = [1, 2, 3, 4, 5]
>>> iterator = sequence.__iter__()
>>> iterator.next()
1
>>> iterator.next()
2
>>> for number in iterator:
print number
3
4
5
Maintenant, revenons à itertools
. Le paquet contient des fonctions pour diverses itérations. Si vous avez un jour besoin de faire un séquençage spécial, c'est le premier endroit à consulter.
En bas, vous pouvez trouver le Recettes qui contiennent des recettes pour créer un ensemble d'outils étendu en utilisant les itertools existants comme blocs de construction .
Et il existe une fonction intéressante qui fait exactement ce dont vous avez besoin :
def consume(iterator, n):
'''Advance the iterator n-steps ahead. If n is none, consume entirely.'''
collections.deque(itertools.islice(iterator, n), maxlen=0)
Voici un exemple rapide et lisible de son fonctionnement (Python 2.5) :
>>> import itertools, collections
>>> def consume(iterator, n):
collections.deque(itertools.islice(iterator, n))
>>> iterator = range(1, 16).__iter__()
>>> for number in iterator:
if (number == 5):
# Disregard 6, 7, 8, 9 (5 doesn't get printed just as well)
consume(iterator, 4)
else:
print number
1
2
3
4
10
11
12
13
14
15