
Il modulo itertools di Python
Il modulo itertools in Python ti mette a disposizione delle funzioni costruite per creare e utilizzare iteratori. Sono soluzioni efficienti e a basso consumo di memoria per manipolare sequenze e iterabili.
Cosa sono gli Iteratori? Gli iteratori sono oggetti in Python che implementano i metodi __iter__() e __next__(). Gli iteratori sono iterabili, ma a differenza delle liste o delle tuple, essi producono valori al volo e non occupano memoria per l'intera sequenza.
Ecco alcune funzioni che puoi trovare nel modulo itertools
Infinite Iterators
Come suggerisce il nome, queste funzioni producono una sequenza infinita di valori quando iterati. Sono molto utili quando hai bisogno di generare una sequenza continua di valori.
Poiché questi iteratori non terminano mai, devi fare attenzione quando li utilizzi, in modo da non finire in un loop infinito. Quando utilizzi gli "Infinite Iterators", è importante avere un criterio di terminazione (come un break in un ciclo for) per evitare loop infiniti nel tuo codice.
Count
Questa funzione inizia a contare da start e incrementa il conteggio di step ad ogni iterazione. Continuerà a produrre numeri all'infinito.
count(start=0, step=1)
Ad esempio, questo script produce in output una sequenza di numeri
- from itertools import count
- for i in count(5, 3):
- if i > 20:
- break
- print(i)
Questo script elenca i numeri a partire da start=5 con un incremento pari a step=3, terminando il ciclo quando i numeri oltrepassano 20.
5
8
11
14
17
20
cycle
Questa funzione prende un iterable come argomento e produce un ciclo.
cycle(iterabile)
Ecco un esempio pratico.
- from itertools import cycle
- counter = 0
- for item in cycle('ABCD'):
- if counter > 7:
- break
- print(item)
- counter += 1
Lo script produce in output questa sequenza di lettere
A
B
C
D
A
B
C
D
repeat
Questa funzione ripete l'elemento elemento all'infinito, a meno che non venga fornito un numero specifico di times per ripetere.
repeat(elemento, times=None):
Ecco un esempio.
- from itertools import repeat
- for item in repeat('X', 4):
- print(item)
Il risultato in output è il seguente
X
X
X
X
Queste funzioni sono semplici ma potenti, e diventano particolarmente utili quando combinate con altre funzioni e costrutti in Python.
Combinatori
Sono funzioni che generano sequenze di elementi combinati in vari modi a partire da uno o più iterabili dati in input. Queste funzioni sono estremamente utili nelle applicazioni di matematica combinatoria, nel calcolo delle permutazioni. combinazioni o disposizioni di un insieme di elementi.
product
Questa funzione restituisce il prodotto cartesiano degli iterabili forniti come input. Tramite il parametro repeat puoi indicare quante volte vuoi replicare l'iterabile.
product(*iterables, repeat=1)
Ecco un esempio di utilizzo.
from itertools import product
product('AB', repeat=2)
Questa funzione produce in output
('A', 'A'), ('A', 'B'), ('B', 'A'), ('B', 'B')
permutations
Genera tutte le possibili permutazioni di lunghezza r
di un iterabile. Se r
non è specificato, si assumono tutte le lunghezze dell'iterabile.
permutations(iterable, r=None)
Ad esempio, digita questo comando
from itertools import permutations
permutations('ABC', 2)
La funzione produce tutte le permutazioni possibili
('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')
combinations
Produce combinazioni uniche di lunghezza r
dall'iterabile. A differenza delle permutazioni, l'ordine degli elementi non conta qui.
combinations(iterable, r)
Ecco un esempio pratico.
from itertools import combinations
combinations('ABC', 2)
La funzione restituisce tutte le combinazioni degli elementi
('A', 'B'), ('A', 'C'), ('B', 'C')
combinations_with_replacement
Genera tutte le possibili combinazioni con ripetizione.
combinations_with_replacement(iterable, r)
Ecco un esempio pratico:
from itertools import combinations_with_replacement
combinations_with_replacement('ABC', 2)
La funzione produce tutte le combinazioni possibili includendo la ripetizione degli elementi.
('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')
Filtraggio
Sono funzioni usate per filtrare o selezionare gli elementi di un iterabile in base a determinate condizioni o criteri.
filterfalse
Questa funzione fa esattamente l'opposto della funzione built-in filter(). Invece di restituire gli elementi dell'iterable per cui la funzione predicate restituisce True, filterfalse restituisce gli elementi per cui predicate restituisce False.
filterfalse(predicate, iterable)
Ad esempio, in questo script la condizione è True quando gli elementi sono pari.
from itertools import filterfalse
result = filterfalse(lambda x: x%2 == 0, [1, 2, 3, 4, 5])
print(list(result))
Quindi, la funzione restituisce tutti gli elementi che non soddisfano il criterio di selezione ossia i numeri dispari.
[1, 3, 5]
takewhile
Questa funzione restituisce elementi dall'iterable fino a quando il predicate restituisce True. Una volta che predicate restituisce False, la funzione si ferma e non elabora ulteriori elementi, anche se ci sono elementi successivi nell'iterable che soddisfano la condizione.
takewhile(predicate, iterable):
Ecco un esempio pratico.
from itertools import takewhile
result = takewhile(lambda x: x < 5, [1, 2, 3, 4, 5, 4, 3, 2, 1])
print(list(result))
Lo script seleziona tutti i numeri minori di 5 fin quando non trova il numero 5.
[1, 2, 3, 4]
dropwhile
Questa funzione fa l'opposto di takewhile(). Ignora gli elementi dall'iterable finché il predicate restituisce True. Una volta che predicate restituisce False, la funzione inizia a restituire tutti gli elementi successivi, indipendentemente dal fatto che soddisfino o meno la condizione.
dropwhile(predicate, iterable)
Ecco un esempio di utilizzo.
from itertools import dropwhile
result = dropwhile(lambda x: x < 5, [1, 2, 3, 4, 5, 4, 3, 2, 1])
print(list(result))
Restituisce tutti i numeri dopo aver trovato il primo elemento incluso (5) che non soddisfa il criterio x<5.
[5, 4, 3, 2, 1]
islice
Anche se non è strettamente una funzione di filtraggio, islice() permette di selezionare una sotto-sequenza di un iterabile, simile alla notazione di slice delle liste. Può essere utilizzato per ottenere un range specifico di elementi da un iterabile.
islice(iterable, start, stop[, step])
Ecco un esempio pratico.
from itertools import islice
result = islice([1, 2, 3, 4, 5], 1, 4)
print(list(result))
Seleziona gli elementi della lista presenti dalla posizione 1 (seconda) alla posizione 4 esclusa (quinta)
[2, 3, 4]
Queste sono solo alcune delle molteplici funzionalità offerte da itertools.