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(), e a 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].
Sommario
- 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.