Python Funzioni Lambda con ESEMPI
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, nota che non usiamo le parentesi attorno ai parametri come facciamo con le funzioni normali. L'ultima parte (espressione) รจ qualsiasi espressione python valida che opera sui parametri che fornisci 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))
Ecco l'output:
3
Spiegazione del codice
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. Ancora una volta, 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? Diamo un'occhiata al codice per capire meglio.
Spiegazione del codice
- Qui definiamo a stringa che passerai come parametro alla lambda.
- Dichiariamo una lambda che chiama un'istruzione print e 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 esiste detto dalla funzione di stampa ma semplicemente di ritorno l'oggetto funzione e la posizione di memoria in cui รจ archiviato. 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)
Ed eseguilo premendo F5, vedrai un output come questo.
Produzione:
some kind of a useless lambda
Ora, la lambda viene chiamata e la stringa che passiamo viene stampata sulla console. Ma cos'รจ questa strana sintassi e perchรฉ la definizione della lambda รจ racchiusa tra parentesi? Cerchiamo di capirlo ora.
Spiegazione del codice
- Ecco la stessa stringa che abbiamo definito nell'esempio precedente.
- In questa parte definiamo una lambda e la chiamiamo immediatamente passando la stringa come argomento. Questo รจ qualcosa chiamato IIFE e ne imparerai di piรน nelle prossime sezioni di questo tutorial.
esempio 4
Diamo un'occhiata a un esempio finale per capire come vengono eseguite le lambda e le funzioni regolari. 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 qualcosa del genere.
Produzione:
printer 1 REGULAR CALL printer 2 REGULAR CALL printer 1 LAMBDA CALL printer 2 LAMBDA CALL
Spiegazione del codice
- Una funzione chiamata guru che accetta un'altra funzione come primo parametro e tutti gli altri argomenti che la seguono.
- stampante_one รจ una semplice funzione che stampa il parametro passato e lo restituisce.
- stampante_due รจ simile a stampante_uno ma senza l'istruzione return.
- In questa parte chiameremo la funzione guru e passeremo le funzioni della stampante e una stringa come parametri.
- Questa รจ la sintassi per raggiungere il quarto passaggio (ovvero richiamare la funzione guru) ma utilizzando lambda.
Nella sezione successiva imparerai come utilizzare le funzioni lambda con carta geografica(), ridurre(), and 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. Ciรฒ significa che una funzione lambda รจ richiamabile non appena viene definita. Capiamolo con un esempio; accendi 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. Ci vogliono 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]
Spiegazione del codice:
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(), richiede anche 2 parametri:
- Una funzione che definisce l'operazione da eseguire sugli elementi
- 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]
[KR1]
Spiegazione del codice:
- Qui definiamo un elenco chiamato sequenze che contiene alcuni numeri.
- Dichiariamo una variabile chiamata filtered_result che memorizzerร i valori mappati
- Una funzione lambda che viene eseguita su ciascun elemento della lista e restituisce il quadrato di quel numero.
- 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:
- Una funzione che definisce l'operazione da eseguire
- 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
Spiegazione del codice:
- Importa la riduzione dal modulo functools
- Qui definiamo un elenco chiamato sequenze che contiene alcuni numeri.
- Dichiariamo una variabile chiamata prodotto che memorizzerร il valore ridotto
- Una funzione lambda che viene eseguita su ciascun elemento dell'elenco. Restituirร il prodotto di quel numero come per il risultato precedente.
- Stampa il risultato restituito dalla funzione di riduzione.
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 utilizzare i lambda e quando evitarli. In questa sezione imparerai alcuni dei principi di progettazione utilizzati dagli sviluppatori Python durante la scrittura di lambda.
Uno dei casi d'uso piรน comuni per lambda รจ nella programmazione funzionale come Python supporta un paradigma (o stile) di programmazione noto come programmazione funzionale.
Permette di fornire una funzione come parametro ad un'altra funzione (ad esempio, in mappa, filtro, ecc.). In questi casi, l'utilizzo di lambda offre un modo elegante per creare una funzione monouso 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[vV4][J5] solo 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 regolari 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.
Ai Lambda non รจ associato alcun nome. Ecco perchรฉ sono conosciute anche 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 valore dovrebbero 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 it. Una funzione lambda non contiene un'istruzione return perchรฉ avrร solo una singola espressione che viene sempre restituita per impostazione predefinita. Non devi nemmeno assegnare una lambda perchรฉ puรฒ essere immediatamente invocata (vedi la prossima sezione). Come vedrai nell'esempio seguente, 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.
Come puoi vedere nel diagramma, le due definizioni vengono gestite allo stesso modo dall'interprete Python quando vengono convertite in bytecode. Ora, non puoi nominare una funzione lambda perchรฉ รจ riservato da Python, ma qualsiasi altro nome di funzione produrrร lo stesso bytecode[KR6].
Sintesi
- Le lambda, note anche come funzioni anonime, sono funzioni piccole e limitate che non necessitano di un nome (ovvero un identificatore).
- Ogni funzione lambda in Python ha 3 parti essenziali:
- La parola chiave lambda.
- I parametri (o variabili legate), e
- Il corpo della funzione.
- La sintassi per scrivere una lambda รจ: parametro lambda: espressione
- I lambda possono avere un numero qualsiasi di parametri, ma non sono racchiusi tra parentesi graffe
- Una lambda puรฒ avere solo 1 espressione nel corpo della funzione, che viene restituito per impostazione predefinita.
- A livello di bytecode, non c'รจ molta differenza tra il modo in cui le lambda e le funzioni regolari vengono gestite dall'interprete.
- I Lambda supportano IIFE tramite questa sintassi: (parametro lambda: espressione) (argomento)
- Le funzioni Lambda vengono comunemente utilizzate con i seguenti componenti Python integrati:
- Filtro: filtro (parametro lambda: espressione, sequenza iterabile)
- Mappa: mappa (parametro lambda: espressione, sequenze iterabili)
- Riduci: riduci (parametro lambda1, parametro2: espressione, sequenza iterabile)
- Non scrivere complicate funzioni lambda in un ambiente di produzione perchรฉ sarebbe difficile per i manutentori del codice.
[J5]Ho aggiunto una tabella, ma la spiegazione รจ necessaria per comprendere le differenze.
