Introduzione

map() è una funzione integrata in Python che applica una funzione a tutti gli elementi in un dato iterabile. Ti permette di scrivere codice semplice e pulito senza usare loop.

La funzione map() in Python

La funzione map() assume la forma seguente:

map(function, iterable, ...)

Accetta due argomenti obbligatori:

  • function - Funzione chiamata per ogni elemento di iterable.
  • iterable - Uno o più oggetti che supportano l'iterazione. La maggior parte degli oggetti incorporati in Python, come elenchi, dizionari e tuple sono iterabili.

In Python 3, map() restituisce un oggetto mappa con una dimensione uguale all'oggetto iterabile passato. In python 2 la funzione restituisce un elenco.

Diamo un'occhiata a un esempio per spiegare meglio come utilizzare la funzione map(). Supponiamo di avere un elenco di stringhe e che vorremmo convertire ogni elemento nell'elenco in maiuscolo.

Un modo per farlo è usare il loop tradizionale for:

directions = ["north", "east", "south", "west"]
directions_upper = []

for direction in directions:
    d = direction.upper()
    directions_upper.append(d)

print(directions_upper)
['NORTH', 'EAST', 'SOUTH', 'WEST']

Con la funzione map(), il codice sarà molto più semplice e flessibile.

def to_upper_case(s):
    return s.upper()

directions = ["north", "east", "south", "west"]

directions_upper = map(to_upper_case, directions)

print(list(directions_upper))

Stiamo usando la funzione list() per convertire l'oggetto mappa restituito in un elenco:

['NORTH', 'EAST', 'SOUTH', 'WEST']

Se la funzione di callback è semplice, il modo più conveniente è usare una funzione lambda:

directions = ["north", "east", "south", "west"]

directions_upper = map(lambda s: s.upper(), directions)

print(list(directions_upper))

Una funzione lambda è una piccola funzione anonima.

Ecco un altro esempio che mostra come creare un elenco di numeri quadrati da 1 a 10:

squares = map(lambda n: n*n , range(1, 11))
print(list(squares))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

La funzione range() genera una sequenza di numeri interi.

Utilizzare map() con più Iterable

Puoi passare tutti gli iterabili che vuoi alla funzione map(). Il numero di argomenti di input richiesti che la funzione di callback accetta deve essere uguale al numero degli iterabili.

L'esempio seguente mostra come eseguire la moltiplicazione degli elementi in due elenchi:

def multiply(x, y):
  return x * y

a = [1, 4, 6]
b = [2, 3, 5]

result = map(multiply, a, b)

print(list(result))
[2, 12, 30]

Lo stesso codice, ma usando la funzione lambda apparirà così:

a = [1, 4, 6]
b = [2, 3, 5]

result = map(lambda x, y: x*y, a, b)

print(list(result))

Quando vengono forniti più iterabili, la dimensione dell'oggetto restituito è uguale all'iterabile più breve.

Vediamo un esempio quando gli iterabili non hanno la stessa lunghezza:

a = [1, 4, 6]
b = [2, 3, 5, 7, 8]

result = map(lambda x, y: x*y, a, b)

print(list(result))

Gli elementi in eccesso (7 e 8) vengono ignorati:

[2, 12, 30]

Conclusione

La funzione map() di Python accetta un oggetto iterabile, insieme a una funzione e applica quella funzione a ciascun elemento nell'iterabile.