Adresse : http://docs.python.org/3.3/library/itertools.html
Utilité : création d’itérateurs pour boucles efficaces
Syntaxe : import itertools, ou from itertools import *, ou from itertools import accumulate, etc.
Voici une sélection de fonctions issues du module itertools :
count(n, h) |
crée un itérateur démarrant à n, de pas h (h = 1 par défaut) |
cycle(s) |
crée un itérateur produisant en boucle les valeurs d’une séquence finie s |
repeat(x,n) |
crée un itérateur produisant n fois la valeur x (si n absent, répétition infinie) |
accumulate(s)accumulate(s,f ) |
crée un itérateur produisant les sommes cumulées d’une séquence finie s. crée un itérateur produisant les valeurs v = s , v = f (v , s ), v = f (v , s ), etc. 0 0 1 0 1 1 1 2 |
chain(s,s’,s »,· · · ) |
crée un itérateur produisant les valeurs de s, puis celles de s’, celles de s », etc. |
product(s,s’,s »,· · · )product(s,repeat=n) |
crée un itérateur produisant les valeurs du produit cartésien s × s’ × s » × · · · crée un itérateur produisant les valeurs du produit cartésien sn |
permutations(s,n)permutations(s) |
crée un itérateur produisant les n-uples d’éléments distincts crée un itérateur produisant les permutations d’éléments de la séquences s |
combinations(s,n) |
crée un itérateur produisant les n-uples ordonnés d’éléments distincts (utiliser combinations_with_replacement pour des combinaisons avec répétitions) |
Voici quelques exemples d’utilisation.
On a utilisé le constructeur list pour visualiser facilement la liste des valeurs rendues par les différents itérateurs créés ici, mais on répète que l’utilité de ces itérateurs (on devrait plus précisément parler de générateurs) est de nous permettre d’accéder aux valeurs successives d’une séquence, sans pour autant créer la totalité de cette séquence en mémoire.
Les générateurs tels qu’ils sont créés ici sont en général utilisés dans un “contexte d’itération” (boucle for). Ils peuvent également être utilisés “en mode manuel”, en leur demandant de délivrer leurs valeurs par des next successifs.
On visitera http://docs.python.org/3.3/library/itertools.html#itertools-recipes pour de nombreux exemples d’utilisation des fonctions du module itertools
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
>>> from itertools import * # importe tout le module (noms courts) >>> c = cycle('abc'); [next(c) for k in range(14)] # 14 valeurs du cycle a → b → c → a ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b'] >>> list(chain('abcd','efg')) # enchaîne deux séquences de caractères ['a', 'b', 'c', 'd', 'e', 'f', 'g'] >>> list(accumulate(range(1,10))) # sommes cumulées de {1, 2, . . . , 9} [1, 3, 6, 10, 15, 21, 28, 36, 45] >>> list(accumulate(range(1,10),lambda x,y: x*y)) # produits cumulés de {1, 2, . . . , 9} [1, 2, 6, 24, 120, 720, 5040, 40320, 362880] >>> list(product(range(2),range(4))) # éléments de {0, 1} × {0, 1, 2, 3} [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3)] >>> [(x,y) for x in range(2) for y in range(4)] # la même chose sans itertools [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3)] >>> list(product(range(3),repeat=2)) # les éléments de {0, 1, 2} × {0, 1, 2} [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)] >>> list(product(range(2),repeat=3)) # les éléments de {0, 1} × {0, 1} × {0, 1} [(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)] >>> list(permutations(range(3))) # les 6 permutations de {0, 1, 2} [(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)] >>> list(permutations(range(4),2)) # les couples d'éléments de {0, 1, 2, 3} [(0, 1), (0, 2), (0, 3), (1, 0), (1, 2), (1, 3), (2, 0), (2, 1), (2, 3), (3, 0), (3, 1), (3, 2)] >>> list(combinations(range(5),2)) # les paires d'éléments de {0, 1, 2, 3, 4} [(0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)] >>> list(combinations_with_replacement(range(4),2)) # paires avec répétitions de {0, 1, 2, 3} [(0, 0), (0, 1), (0, 2), (0, 3), (1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)] |
Retour à l’accueil du cours Python/Numpy
Sommaire du chapitre 7
- Le module random
- Le module decimal
- Le module fractions
- Le module string
- Le module itertools
- Les modules operator et functools
- Le module time
- La classe Counter du module collections
- La classe deque du module collections
- Le module heapq
- Le module bisect
- Le module copy
- Autres modules et adresses utiles