Storia della domanda
La funzione map() esiste in Python dalle versioni più antiche come riflesso della programmazione funzionale. Viene utilizzata per applicare una funzione a ciascun elemento di un oggetto iterabile.
Problema
Non tutti gli sviluppatori principianti comprendono la differenza tra map, generatori ed espressioni di lista. Ci sono domande sulle prestazioni, la leggibilità e la compatibilità con l'elaborazione dei dati pigra.
Soluzione
La funzione map() accetta una funzione e uno o più oggetti iterabili, restituendo un iteratore pigro in cui la funzione viene applicata sequenzialmente a ciascun elemento. Questo è efficiente in termini di memoria e consente di elaborare grandi volumi di dati senza creare liste intermedie.
Esempio di codice:
# Restituisce il quadrato dei numeri tramite map numbers = [1, 2, 3, 4] squares = map(lambda x: x**2, numbers) print(list(squares)) # [1, 4, 9, 16]
Caratteristiche chiave:
La funzione map() può lavorare con due o più sequenze contemporaneamente? Come farlo?
Sì, è possibile passare più sequenze se la funzione accetta lo stesso numero di argomenti. L'iterazione terminerà non appena il più corto degli oggetti iterabili termina.
Esempio di codice:
a = [1, 2, 3] b = [4, 5, 6] res = list(map(lambda x, y: x + y, a, b)) print(res) # [5, 7, 9]
Cosa restituirà map() se si passa una funzione che restituisce None?
Ogni elemento di map sarà None. Se la funzione non restituisce esplicitamente un valore, il risultato sarà sempre una lista di None:
def print_val(x): print(x) # nessun return list(map(print_val, [1,2,3])) # [None, None, None] e tre stampe nella console
Qual è la differenza fra map() e un'espressione di lista in termini di memoria consumata?
map non crea subito tutto il risultato in memoria, ma calcola su richiesta; l'espressione di lista [...] crea una lista completa. Per grandi volumi di dati, l'uso di map è preferibile se non è necessaria l'intera corrispondenza istantaneamente.
Nel progetto si è utilizzato map per attraversare una lista con una funzione che scrive su un file, dimenticando di restituire un valore. Ci si aspettava l'apparizione di dati, ma map ha restituito un iteratore con None.
Pro:
Contro:
Si è utilizzato map per l'elaborazione e il filtraggio di una grande lista di log, scrivendo una funzione pura che restituisce il risultato. L'iteratore map restituiva sequenzialmente valori per la scrittura su un file senza sovraccaricare la memoria.
Pro:
Contro: