Skip to content

Espressioni lambda in Python

Python

In Python, le funzioni sono definite con le istruzioni def. Puoi anche usare lambda per creare funzioni anonime. È possibile utilizzare le espressioni lambda quando è necessario specificare una funzione come argomento.

In questo articolo vengono descritti i seguenti contenuti.

  • Nozioni di base sulle espressioni lambda
  • Espressioni Lambda con se
  • PEP8 consiglia di non nominare le espressioni lambda
  • Esempi di espressioni lambda
    • Il parametro chiave di sorted(), sort(), max(), min()
    • mappa(), filtro()

Vedere il seguente articolo per le nozioni di base sulle funzioni in Python.

Nozioni di base sulle espressioni lambda

La definizione della funzione mediante l’istruzione def e la corrispondente espressione lambda è la seguente.

def function_name(parameters, ...):
    return expression

function_name = lambda parameters, ...: expression

Per comodità, nell’esempio precedente, all’espressione lambda viene assegnato un nome, ma non è consigliato in PEP8 come più descritto avanti.

L’esempio concreto è il seguente. Puoi anche specificare un argomento predefinito.

def add_def(a, b=1):
    return a + b

add_lambda = lambda a, b=1: a + b

print(add_def(3, 4))
# 7

print(add_def(3))
# 4

print(add_lambda(3, 4))
# 7

print(add_lambda(3))
# 4

Espressioni Lambda con se

Non è possibile utilizzare istruzioni su più righe nelle espressioni lambda, ma è possibile utilizzare espressioni condizionali.

get_odd_even = lambda x: 'even' if x % 2 == 0 else 'odd'

print(get_odd_even(3))
# odd

print(get_odd_even(4))
# even

PEP8 consiglia di non nominare le espressioni lambda

Se si assegna un nome a un’ lambda come negli esempi precedenti, potrebbe essere visualizzato un avviso con il controllo dell’espressione del codice.

Do not assign a lambda expression, use a def (E731)

PEP8 (Style Guide for Python Code) raccomanda che le espressioni lambda debbano essere utilizzate senza nome e che def sia usato quando si definisce una funzione con un nome.

Usa sempre un’istruzione def invece di un’istruzione di assegnazione che associa un’espressione lambda direttamente a un identificatore:
PEP 8 — Guida di stile per codice Python | Python.org

Poiché è solo consigliato ma non proibito, può essere eseguito senza alcun errore, anche se si chiama lambda.

Esempi di espressioni lambda

Il parametro chiave di sorted(), sort(), max(), min()

La funzione incorporata sort() e il metodo list sort() e le funzioni integration max() e min() hanno un parametro chiave.

È possibile specificare una funzione applicata a ciascun elemento dell’oggetto iterabile prima che ogni elemento venga confrontato per la chiave.

Prendi la funzione integrata sorted() come esempio.

L’elenco delle stringhe è ordinato alfabeticamente per la definizione predefinita.

l = ['Charle', 'Bob', 'Alice']

l_sorted = sorted(l)

print(l_sorted)
# ['Alice', 'Bob', 'Charle']

Se specifichi la funzione incorporata len() che contiene il numero di caratteri nella chiave dell’, verrà ordinata in base al numero di caratteri.

print(len('Alice'))
# 5

l_sorted_len = sorted(l, key=len)

print(l_sorted_len)
# ['Bob', 'Alice', 'Charle']

Puoi usare un’espressione lambda per applicare qualsiasi funzione a ciascun elemento e ordinare in base al risultato. Ad esempio, se specifichi un’espressione lambda per ottenere il secondo carattere nella chiave dell’argomento, verrà ordinata in ordine alfabetico nel secondo carattere.

print((lambda x: x[1])('Alice'))
# l

l_sorted_second = sorted(l, key=lambda x: x[1])

print(l_sorted_second)
# ['Charle', 'Alice', 'Bob']

mappa(), filtro()

In map(), che applica una funzione a tutti gli elementi di un iterable, e filter(), che estrae elementi che soddisfano una condizione, il primo argomento è una funzione (oggetto richiamabile) e il secondo argomento è un oggetto iterabile come un elenco.

Se si desidera specificare una funzione più specifica (oggetto richiamabile) come argomento, utilizzare un’espressione lambda è semplice che definire la funzione con un’istruzione def.

Si noti che la stessa operazione di map() e filter() può essere scritta con la comprensione degli elenchi e le espressioni del generatore. In molti casi è più facile scrivere usando la comprensione degli elenchi e le espressioni del generatore.

carta geografica()

Specificare un’espressione lambda che quadra il valore nel primo argomento. Nota che map() riporta un iteratore invece di un elenco in Python3.

l = [0, 1, 2, 3]

map_square = map(lambda x: x**2, l)

print(map_square)
# 

 



print(list(map_square))
# [0, 1, 4, 9]

Se vuoi ottenere una lista, puoi anche scrivere con la comprensione della lista.

l_square = [x**2 for x in l]

print(l_square)
# [0, 1, 4, 9]

Se vuoi ottenere un iteratore, usa un’espressione del generatore.

g_square = (x**2 for x in l)

print(g_square)
#  at 0x1072b6d00>

print(list(g_square))
# [0, 1, 4, 9]

filtro()

Specificare un’espressione lambda che determini i numeri pari come True nel primo argomento.

filter() fornisce un iteratore in Python3 come map().

filter_even = filter(lambda x: x % 2 == 0, l)

print(list(filter_even))
# [0, 2]

Questo può anche essere scritto con la comprensione degli elenchi e le espressioni del generatore.

l_even = [x for x in l if x % 2 == 0]

print(l_even)
# [0, 2]

Vedere l’articolo seguente per i dettagli sull’estrazione di elementi da un elenco.