Python Funzioni Lambda con ESEMPI

⚡ Riepilogo intelligente

Le funzioni Lambda in Python Le lambda sono piccole funzioni anonime definite con la parola chiave lambda anziché def. Contengono una singola espressione, accettano un numero qualsiasi di argomenti e vengono spesso passate direttamente a funzioni integrate come map(), filter() e sorted().

  • 🔑 Parola chiave Lambda: Una lambda viene scritta come lambda arguments: expression, senza def, senza name e senza un'istruzione return esplicita.
  • 🧮 Espressione singola: Il corpo contiene esattamente un'espressione il cui valore viene restituito automaticamente, pertanto non sono consentite istruzioni e righe multiple.
  • 🔗 Abbinamento integrato: Le espressioni lambda vengono comunemente passate alle funzioni map(), filter(), reduce() e sorted() per trasformare o selezionare elementi in una sequenza.
  • IIFE: È possibile definire e chiamare immediatamente una lambda utilizzando il modello (lambda x: x + x)(2), restituendo un risultato all'istante.
  • Contro definizione: Le funzioni regolari necessitano di un nome e possono contenere molte istruzioni, mentre le lambda sacrificano questa potenza in favore di una sintassi compatta, su una sola riga.
  • 🤖 Assistenza AI: Gli assistenti basati sull'intelligenza artificiale, come GitHub Copilot, generano espressioni lambda per le chiavi di mappatura, filtro e ordinamento a partire da un breve input.

Python Funzioni Lambda

In cosa consiste la funzione Lambda Python?

A Funzione Lambda inserita Python la programmazione è una funzione anonima o una funzione senza nome. È una funzione piccola e limitata che non ha più di una riga. Proprio come una funzione normale, una funzione Lambda può avere più argomenti con un'unica espressione.

In Python, le espressioni lambda (o forme lambda) vengono utilizzate per costruire funzioni anonime. Per fare ciò, utilizzerai il file lambda parola chiave (proprio come usi def per definire le funzioni normali). Ogni funzione anonima definita in Python avrà 3 parti essenziali:

  • La parola chiave lambda.
  • I parametri (o variabili legate), e
  • Il corpo della funzione.

Una funzione lambda può avere un numero qualsiasi di parametri, ma il corpo della funzione può solo contenere prima espressione. Inoltre una lambda è scritta in un'unica riga di codice e può essere invocata anche immediatamente. Vedrai tutto questo in azione nei prossimi esempi.

Sintassi ed esempi

La sintassi formale per scrivere una funzione lambda è la seguente:

lambda p1, p2: expression

Qui, p1 e p2 sono i parametri che vengono passati alla funzione lambda. Puoi aggiungere tutti i parametri di cui hai bisogno o pochi.

Tuttavia, notate che non usiamo le parentesi intorno ai parametri come facciamo con le funzioni normali. L'ultima parte (espressione) è qualsiasi valida Python espressione che opera sui parametri forniti alla funzione.

esempio 1

Ora che conosci le lambda, proviamolo con un esempio. Quindi, apri il tuo IDLE e digita quanto segue:

adder = lambda x, y: x + y
print (adder (1, 2))

Code Spiegazione

Qui definiamo una variabile che manterrà il risultato restituito dalla funzione lambda.

1. La parola chiave lambda utilizzata per definire una funzione anonima.

2. xey sono i parametri che passiamo alla funzione lambda.

3. Questo è il corpo della funzione, che aggiunge i 2 parametri che abbiamo passato. Si noti che si tratta di una singola espressione. Non è possibile scrivere più istruzioni nel corpo di una funzione lambda.

4. Chiamiamo la funzione e stampiamo il valore restituito.

esempio 2

Questo era un esempio di base per comprendere i fondamenti e la sintassi di lambda. Proviamo ora a stampare una lambda e vediamo il risultato. Di nuovo, apri il tuo IDLE e digita quanto segue:

#What a lambda returns
string='some kind of a useless lambda'
print(lambda string : print(string))

Ora salva il tuo file e premi F5 per eseguire il programma. Questo è l'output che dovresti ottenere.

Produzione:

<function <lambda> at 0x00000185C3BF81E0>

Cosa sta succedendo qui? Analizziamo il codice per comprenderlo meglio.

Code Spiegazione:

1. Qui definiamo un stringa che passerai come parametro alla lambda.

2. Dichiariamo una lambda che richiama un'istruzione print e ne stampa il risultato.

Ma perché il programma non stampa la stringa che passiamo? Questo perché la lambda stessa restituisce un oggetto funzione. In questo esempio, la lambda non viene detto dalla funzione di stampa ma è semplicemente di ritorno l'oggetto funzione e l'indirizzo di memoria in cui è memorizzato. Questo è ciò che viene stampato sulla console.

esempio 3

Tuttavia, se scrivi un programma come questo:

#What a lambda returns #2
x="some kind of a useless lambda"
(lambda x : print(x))(x)

Eseguilo premendo F5, vedrai un output simile a questo.

Produzione:

some kind of a useless lambda

Ora, la lambda viene chiamata e la stringa che le passiamo viene stampata sulla console. Ma cos'è quella strana sintassi e perché la definizione della lambda è racchiusa tra parentesi quadre? Cerchiamo di capirlo.

Code Spiegazione:

1. Ecco la stessa stringa che abbiamo definito nell'esempio precedente.

2. In questa parte, definiamo una lambda e la richiamiamo immediatamente passando la stringa come argomento. Questo è ciò che viene chiamato IIFE (Initial IIfe Function Expression), e ne saprai di più nelle sezioni successive di questo tutorial.

esempio 4

Vediamo un ultimo esempio per capire come vengono eseguite le lambda e le funzioni normali. Quindi, apri il tuo IDLE e in un nuovo file, digita quanto segue:

#A REGULAR FUNCTION
def guru( funct, *args ):
funct( *args )
def printer_one( arg ):
return print (arg)
def printer_two( arg ):
print(arg)
#CALL A REGULAR FUNCTION 
guru( printer_one, 'printer 1 REGULAR CALL' )
guru( printer_two, 'printer 2 REGULAR CALL \n' )
#CALL A REGULAR FUNCTION THRU A LAMBDA
guru(lambda: printer_one('printer 1 LAMBDA CALL'))
guru(lambda: printer_two('printer 2 LAMBDA CALL'))

Ora, salva il file e premi F5 per eseguire il programma. Se non hai commesso errori, l'output dovrebbe essere simile a questo.

Produzione:

printer 1 REGULAR CALL

printer 2 REGULAR CALL

printer 1 LAMBDA CALL

printer 2 LAMBDA CALL

Code Spiegazione:

1. Una funzione chiamata guru che accetta un'altra funzione come primo parametro e tutti gli altri argomenti che la seguono.

2. printer_one è una semplice funzione che stampa il parametro che le viene passato e lo restituisce.

3. printer_two è simile a printer_one ma senza l'istruzione return.

4. In questa parte, richiamiamo la funzione guru e passiamo come parametri le funzioni della stampante e una stringa.

5. Questa è la sintassi per realizzare il quarto passaggio (ovvero, chiamare la funzione guru) ma utilizzando le espressioni lambda.

Nella sezione successiva imparerai come utilizzare le funzioni lambda con map (), ridurre()e filtro() in Python.

Utilizzando lambda con Python built-in

Le funzioni Lambda forniscono un modo elegante e potente per eseguire operazioni utilizzando metodi incorporati in Python. È possibile perché i lambda possono essere richiamati immediatamente e passati come argomento a queste funzioni.

IIFE dentro Python Lambda

IFE sta per esecuzione della funzione immediatamente invocata. Significa che una funzione lambda è richiamabile non appena viene definita. Cerchiamo di capirlo con un esempio; avvia il tuo IDLE e digita quanto segue:

 (lambda x: x + x)(2)

Ecco l'output e la spiegazione del codice:

Questa capacità dei lambda di essere invocati immediatamente consente di utilizzarli all'interno di funzioni come map() e reduce(). È utile perché potresti non voler utilizzare più queste funzioni.

lambda nel filtro()

La funzione filtro viene utilizzata per selezionare alcuni elementi particolari da una sequenza di elementi. La sequenza può essere qualsiasi iteratore come elenchi, insiemi, tuple, ecc.

Gli elementi che verranno selezionati si basano su alcuni vincoli predefiniti. Richiede 2 parametri:

  • Una funzione che definisce il vincolo di filtraggio
  • Una sequenza (qualsiasi iteratore come liste, tuple, ecc.)

Per esempio,

sequences = [10,2,8,7,5,4,3,11,0, 1]
filtered_result = filter (lambda x: x > 4, sequences) 
print(list(filtered_result))

Ecco l'output:

[10, 8, 7, 5, 11]

Code Spiegazione:

1. Nella prima istruzione definiamo una lista chiamata sequenze che contiene alcuni numeri.

2. Qui dichiariamo una variabile chiamata filtered_result, che memorizzerà i valori filtrati restituiti dalla funzione filter().

3. Una funzione lambda che viene eseguita su ciascun elemento dell'elenco e restituisce true se è maggiore di 4.

4. Stampa il risultato restituito dalla funzione filtro.

lambda nella mappa()

La funzione map viene utilizzata per applicare una particolare operazione a ogni elemento di una sequenza. Come filter(), accetta anche 2 parametri:

  1. Una funzione che definisce l'operazione da eseguire sugli elementi
  2. Una o più sequenze

Ad esempio, ecco un programma che stampa i quadrati dei numeri in un elenco dato:

sequences = [10,2,8,7,5,4,3,11,0, 1]
filtered_result = map (lambda x: x*x, sequences) 
print(list(filtered_result))

Produzione:

 [100, 4, 64, 49, 25, 16, 9, 121, 0, 1]

Code Spiegazione:

1. Qui definiamo un elenco chiamato sequenze che contiene alcuni numeri.

2. Dichiariamo una variabile chiamata filtered_result che memorizzerà i valori mappati.

3. Una funzione lambda che viene eseguita su ciascun elemento della lista e restituisce il quadrato di quel numero.

4. Stampa il risultato restituito dalla funzione map.

lambda in riduzione()

La funzione reduce, come map(), viene utilizzata per applicare un'operazione a ogni elemento in una sequenza. Tuttavia, differisce dalla mappa nel suo funzionamento. Questi sono i passaggi seguiti dalla funzione reduce() per calcolare un output:

Passo 1) Eseguire l'operazione definita sui primi 2 elementi della sequenza.

Passo 2) Salva questo risultato.

Passo 3) Eseguire l'operazione con il risultato salvato e l'elemento successivo nella sequenza.

Passo 4) Ripeti fino a quando non rimangono più elementi.

Richiede inoltre due parametri:

  1. Una funzione che definisce l'operazione da eseguire
  2. Una sequenza (qualsiasi iteratore come liste, tuple, ecc.)

Ad esempio, ecco un programma che restituisce il prodotto di tutti gli elementi in una lista:

from functools import reduce
sequences = [1,2,3,4,5]
product = reduce (lambda x, y: x*y, sequences)
print(product)

Ecco l'output:

120

Code Spiegazione:

1. Importare reduce dal modulo functools.

2. Qui definiamo un elenco chiamato sequenze che contiene alcuni numeri.

3. Dichiariamo una variabile chiamata prodotto che memorizzerà il valore ridotto.

4. Una funzione lambda che viene eseguita su ciascun elemento della lista. Restituirà il prodotto di quel numero in base al risultato precedente.

5. Stampa il risultato restituito dalla funzione reduce.

Perché (e perché no) utilizzare le funzioni lambda?

Come vedrai nella sezione successiva, le lambda vengono trattate allo stesso modo delle normali funzioni a livello di interprete. In un certo senso, si potrebbe dire che le lambda forniscono una sintassi compatta per scrivere funzioni che restituiscono una singola espressione.

Tuttavia, dovresti sapere quando è una buona idea usare le lambda e quando evitarle. In questa sezione, imparerai alcuni dei principi di progettazione utilizzati da Python sviluppatori durante la scrittura di lambda.

Uno dei casi d'uso più comuni per le lambda è nella programmazione funzionale, come Python supporta un paradigma (o stile) di programmazione noto come programmazione funzionale.

Consente di passare una funzione come parametro a un'altra funzione (ad esempio, in map, filter, ecc.). In questi casi, l'utilizzo delle lambda offre un modo elegante per creare una funzione da utilizzare una sola volta e passarla come parametro.

Quando non dovresti usare Lambda?

Non dovresti mai scrivere funzioni lambda complicate in un ambiente di produzione. Sarà molto difficile per i programmatori che gestiscono il tuo codice decifrarlo. Se ti ritrovi a creare espressioni complesse one-liner, sarebbe una pratica molto migliore definire una funzione appropriata. Come buona pratica, devi ricordare che il codice semplice è sempre meglio del codice complesso.

Lambda e funzioni regolari

Come affermato in precedenza, le lambda sono semplicemente funzioni a cui non è associato un identificatore. In parole più semplici, sono funzioni senza nome (quindi, anonime). Ecco una tabella per illustrare la differenza tra lambda e funzioni normali in Python.

Lambda Funzioni regolari
Sintassi:

lambda x : x + x
Sintassi:

def (x) :
return x + x 
Le funzioni Lambda possono avere solo un'espressione nel corpo. Le funzioni regolari possono avere più espressioni e istruzioni nel corpo.
Le funzioni lambda non hanno un nome associato. Per questo motivo sono anche conosciute come funzioni anonime. Le funzioni regolari devono avere un nome e una firma.
I lambda non contengono un'istruzione return perché il corpo viene restituito automaticamente. Le funzioni che devono restituire un valore devono includere un'istruzione return.

Spiegazione delle differenze

La differenza principale tra una funzione lambda e una funzione regolare è che la funzione lambda valuta solo una singola espressione e produce un oggetto funzione. Di conseguenza possiamo dare un nome al risultato della funzione lambda e utilizzarlo nel nostro programma come abbiamo fatto nell'esempio precedente.

Una funzione regolare per l'esempio precedente sarebbe simile a questa:

def adder (x, y):
return x + y 
print (adder (1, 2))

Qui dobbiamo definire a Nome per la funzione che problemi il risultato quando noi chiamata Una funzione lambda non contiene un'istruzione return perché avrà solo una singola espressione che viene sempre restituita per impostazione predefinita. Non è nemmeno necessario assegnare un valore a una lambda, poiché può essere invocata immediatamente (vedi la sezione precedente). Come vedrai, le lambda diventano particolarmente potenti quando le usiamo con Pythonle funzioni integrate.

Tuttavia, potresti ancora chiederti in che modo i lambda sono diversi da una funzione che restituisce una singola espressione (come quella sopra). A livello di interprete non c’è molta differenza. Può sembrare sorprendente, ma qualsiasi funzione lambda definita in Python viene trattata come una normale funzione dall'interprete.

A livello di bytecode, le due definizioni vengono gestite allo stesso modo dal Python interprete. Ora, non puoi dare un nome a una funzione lambda perché è riservato da Pythonma qualsiasi altro nome di funzione produrrà lo stesso bytecode.

DOMANDE FREQUENTI

Sì. Una lambda può utilizzare un'espressione condizionale come lambda x: 'pari' se x % 2 == 0 altrimenti 'dispari'. Non può contenere un'istruzione if completa, perché il corpo di una lambda deve essere una singola espressione e non un blocco di istruzioni.

Generalmente no. PEP 8 raccomanda di usare def quando una funzione ha bisogno di un nome, perché associare una lambda a una variabile le dà un nome ma perde la chiarezza traceback fornito da def. È preferibile passare le lambda direttamente a funzioni come sorted(), map() o filter().

No. A livello di bytecode Python Tratta una lambda e una funzione definita equivalente allo stesso modo, quindi non c'è alcun vantaggio in termini di velocità. Una lambda consente solo di risparmiare una riga di codice; non viene eseguita più velocemente di una funzione definita che svolge lo stesso lavoro.

Sì. Una lambda può leggere le variabili dall'ambito circostante, formando una closure. All'interno di un ciclo, fai attenzione: la lambda cattura la variabile stessa, non il suo valore corrente, quindi usa un argomento predefinito come lambda x, n=n: x + n per congelarla.

Passa una lambda come argomento chiave a sorted() o list.sort(). Ad esempio, sorted(users, key=lambda u: u['age']) ordina gli elementi per età. La lambda indica Python quale valore confrontare per ogni elemento, fornendo un ordinamento personalizzato conciso senza una funzione denominata separata.

Non direttamente, perché una lambda anonima non ha un nome a cui fare riferimento. È possibile ovviare a questo problema assegnando la lambda a una variabile e richiamando quel nome, ma una normale funzione def è la scelta più chiara e consigliata per la ricorsione.

Le lambda consentono trasformazioni rapide e inline nel codice di IA e apprendimento automatico. Gli scienziati dei dati le passano a pandas .apply(), map() e filter() per pulire o rimodellare i dati e come funzioni chiave per l'ordinamento delle caratteristiche, mantieniping preelaborazione compatta all'interno di pipeline di addestramento più ampie.

GitHub Copilot suggerisce espressioni lambda complete a partire da un breve commento o dal codice circostante, inclusi i parametri e l'espressione corretti per le chiamate a map(), filter() o sorted(). Può anche proporre di convertire una lambda prolissa in una funzione con un nome più chiaro quando la leggibilità è importante.

Riassumi questo post con: