Funzioni Lambda in Python

Cosa sono le funzioni Lambda?


In Python le funzioni sono oggetti: possono essere assegnate a variabili, possono essere restituite da altre funzioni, memorizzate in liste o dict e passate come parametri per altre funzioni. Si consideri, ad esempio, il map() funzione incorporata. La sua sintassi è map(function, iterable) ed è usato per applicare facilmente function ad ogni elemento di iterable.

map() in realtà restituisce an iterator oggetto. In pratica, lanciamo il risultato come a list, tuple, set, dict, ecc., a seconda di quale sia più conveniente.

Supponiamo di voler elevare al quadrato ogni termine di una lista utilizzando il map() funzione. Per fare ciò, definiremo a square() funzione e utilizzarla come parametro per map():

my_list = [1,2,3,4,5]
def square(x):
    return x**2

my_modified_list = list(map(square, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]


Tuttavia, se l'unico uso del nostro square() funzione è creare questo elenco, è più pulito usare a lambda funzione:

my_list = [1,2,3,4,5]
my_modified_list = list(map(lambda x: x**2, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]

In Pitone, lambda Le funzioni sono funzioni anonime che prendono nome e sintassi da quelle di Alonzo Church Calcolo lambda. La loro sintassi è:

lambda x_1,..., x_n : expression(x_1, ..., x_n)

Questo crea una funzione anonima che riceve come input le variabili x_1, ..., x_n e restituisce il valutato expression(x_1, ..., x_n).

Stando alla nostra umile opinione, l'obiettivo della promozione della lambda functions deve essere usato come parametro per funzioni che accettano funzioni come parametro, come abbiamo fatto con map() Sopra. Python ti consente di assegnare un file lambda funzione a una variabile, ma il Guida allo stile PEP 8 lo sconsiglia. Se vuoi assegnare una funzione semplice a una variabile, è meglio farlo come definizione di una riga. Ciò garantisce che l'oggetto risultante sia denominato correttamente, migliorando la leggibilità del traceback:

anonymous_square = lambda x : x**2def named_square(x): return x**2print(anonymous_square.__name__)
print(named_square.__name__)


a = anonymous_square
b = named_square
print(a.__name__)
print(b.__name__)

Perché utilizzare le funzioni Lambda?

Dopo l'ultimo paragrafo, ti starai chiedendo perché dovresti usare a lambda funzione. Dopotutto, tutto ciò che può essere fatto con a lambda la funzione potrebbe essere eseguita con una funzione denominata.

La risposta a questo è che lambda della funzione scopo è vivere all'interno di espressioni più grandi che rappresentano un calcolo. Un modo per pensarci è per analogia con variabili e valori. Considera il seguente codice:

x = 2

La variabile x è un segnaposto (o un nome) per il numero intero 2. Ad esempio, chiamando print(x) ed print(2) dà esattamente lo stesso risultato. Nel caso di funzioni:

def square(x): return x**2

La funzione square() è un segnaposto per il calcolo dell'elevazione al quadrato di un numero. Questo calcolo può essere scritto in modo senza nome come lambda x: x**2.

Dopo questa digressione filosofica, vediamo alcuni esempi di applicazioni di lambda funzioni.

Utilizzo di Lambda con la funzione sorted()

Il sorted() la funzione ordina un iterabile. Accetta una funzione come sua key argomento e il risultato della funzione applicata a ciascun elemento dell'iterabile viene utilizzato per ordinare gli elementi.

Questo è perfettamente adatto a a lambda funzione: impostando il key parametro con a lambda funzione, possiamo ordinare in base a qualsiasi tipo di attributo degli elementi. Ad esempio, possiamo ordinare un elenco di nomi per cognome:

name_list = ['Grace Hopper', 'Ada Lovelace', 'Emmy Noether', 'Marie Curie']
​
sorted_by_surname = sorted(name_list, key = lambda x: x.split()[1])
​
print(sorted_by_surname)
['Marie Curie', 'Grace Hopper', 'Ada Lovelace', 'Emmy Noether']

Utilizzo di Lambda con la funzione 'filter()'

Il filter() funzione ha la seguente sintassi: filter(function, iterable) e produce gli elementi di iterable che valutano function(element) come vero (è simile a an WHERE clausola in SQL). Possiamo usare lambda funzioni come parametri per filter() per selezionare elementi da un iterabile.

Considera il seguente esempio:

num_list = list(range(0,100))
​
multiples_of_15= filter(lambda x: (x % 3 == 0) and (x % 5 == 0), num_list)
​
print(list(multiples_of_15))
[0, 15, 30, 45, 60, 75, 90]

filter() applica il lambda function lambda x: (x % 3 == 0) and (x % 5 == 0) ad ogni elemento di range(0,100), e restituisce a filter oggetto. Accediamo agli elementi lanciandolo come list.

Utilizzo di Lambda con la funzione map()


Il nostro ultimo esempio è qualcosa che abbiamo visto nell'introduzione – il map() funzione. Il map() la sintassi della funzione è: map(function, iterable)e map() si applica function ad ogni elemento di iterable, tornando a map oggetto a cui è possibile accedere tramite il cast a a list.

Abbiamo visto come questo può essere applicato alle liste, ma potrebbe essere applicato ai dict usando il dict.items() Metodo:

my_data = {'Mary':1, 'Alice':2, 'Bob':0}
map_obj = map(lambda x: f'{x[0]} had {x[1]} little lamb', my_data.items())
print(', '.join((map_obj)))
Mary had 1 little lamb, Alice had 2 little lamb, Bob had 0 little lamb

o ad una stringa:

my_string = 'abcdefg'
''.join(map(lambda x: chr(ord(x)+2),my_string))
'cdefghi'

Dai un'occhiata alla nostra guida pratica e pratica per l'apprendimento di Git, con le migliori pratiche, gli standard accettati dal settore e il cheat sheet incluso. Smetti di cercare su Google i comandi Git e in realtà imparare esso!

Possiamo usare map() funzione in modi ingegnosi: un esempio è l'applicazione di molte funzioni allo stesso input.

Ad esempio, supponi di creare un'API che riceve una stringa di testo e di voler applicare ad essa un elenco di funzioni.

Ogni funzione estrae alcune caratteristiche dal testo. Le caratteristiche che vogliamo estrarre sono il numero di parole, la seconda parola e la quarta lettera della quarta parola:

def number_of_words(text):
  return len(text.split())
​
def second_word(text):
  return text.split()[1]
​
def fourth_letter_of_fourth_word(text):
  return text.split()[3][3]
​
function_list = [number_of_words, second_word, fourth_letter_of_fourth_word]
​
my_text = 'Mary had a little lamb'
map_obj = map(lambda f: f(my_text), function_list)
​
feature_list = list(map_obj)
​
print(feature_list)
[5, 'had', 't']

Conclusione


In questa guida, abbiamo esplorato la funzionalità di lambda funzioni in Python. L'abbiamo visto lambda Le funzioni sono funzioni anonime da utilizzare come parametro di funzione inline per altre funzioni. Abbiamo visto alcuni casi d'uso e quando non usarli.

Durante la programmazione, è importante tenere a mente la citazione di Donald Knuth: "I programmi sono pensati per essere letti dagli esseri umani e solo incidentalmente per essere eseguiti dai computer". Con questo in testa, lambda Le funzioni sono uno strumento utile per semplificare il nostro codice, ma dovrebbero essere usate con saggezza.

Timestamp:

Di più da Impilamento