You are here: Partenza > Dive Into Python > La potenza dell'introspezione > Usare le funzioni lambda | << >> | ||||
Dive Into PythonPython per programmatori esperti |
Python supporta un'interessante sintassi che vi permette di definire al volo delle piccole funzioni di una sola riga. Derivate dal Lisp, queste funzioni lambda possono essere usate ovunque sia richiesta una funzione.
>>> def f(x): ... return x*2 ... >>> f(3) 6 >>> g = lambda x: x*2 >>> g(3) 6 >>> (lambda x: x*2)(3) 6
Per generalizzare, una funzione lambda è una funzione che prende qualunque numero di argomenti (inclusi quelli opzionali) e ritorna il valore di una singola espressione. Le funzioni lambda non possono contenere comandi e neppure possono contenere più di una espressione. Non cercate di metterci dentro troppa roba: se avete bisogno di uno strumento più complesso, definite una funzione normale e fatela lunga quanto volete.
l'utilizzo o meno delle funzioni lambda è questione di stile. Usarle non è mai necessario; in ogni caso in cui vengono usate è possibile definire una funzione normale e usarla al posto della funzione lambda. Le funzioni lambda sono comode, ad esempio, nei casi in cui si voglia incapsulare codice specifico, non riutilizzato, senza riempire il programma di piccolissime funzioni. |
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
Notiamo alcune cose in questo esempio. Primo, stiamo usando la forma più semplice del trucco and-or, il che va bene, perché una funzione lambda è sempre vera in un contesto booleano. Ciò non significa che una funzione lambda non possa ritornare un valore falso. La funzione è sempre vera; è il suo valore di ritorno, il risultato, che può essere qualunque cosa.
Secondo, stiamo usando la funzione split senza argomenti. L'avete già vista usare con 1 o 2 argomenti, ma senza argomenti spezza la stringa sui caratteri di spazio.
>>> s = "this is\na\ttest" >>> print s this is a test >>> print s.split() ['this', 'is', 'a', 'test'] >>> print " ".join(s.split()) 'this is a test'
Questa è una stringa su più linee, definita da caratteri di escape anziché triple virgolette. \n è il ritorno a capo; \t è il carattere tab. | |
split senza argomenti spezza negli spazi vuoti. Così tre spazi, un ritorno a capo e un carattere di tabulazione vengono trattati nello stesso modo. | |
Potete collassare gli spazi dividendo una stringa e riattaccandola con un carattere di spazio come delimitatore. Questo è ciò che fa la funzione help per collassare una stringa di più linee in una linea sola. |
Cosa fa quindi la funzione help con queste funzioni lambda, split e trucchi and-or?
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
processFunc adesso è una funzione, ma quale funzione sia dipende dal valore della variabile collapse. Se collapse è vera, processFunc(string) collasserà gli spazi vuoti, altrimenti processFunc(string) ritornerà il suo argomento senza alcuna modifica.
Per fare la stessa cosa in un linguaggio meno robusto, come Visual Basic, dovremmo probabilmente creare una funzione che riceve una stringa e l'argomento collapse, usa un'istruzione if per decidere se collassare gli spazi vuoti o no, quindi ritorna il valore appropriato. Ciò sarebbe inefficiente, perché la funzione dovrebbe gestire ogni possibile caso; ogni volta che viene chiamata, dovrebbe decidere se collassare gli spazi prima di restituire il valore desiderato. In Python, potete prendere questa logica di decisione e portarla fuori dalla funzione, definendo una funzione lambda cucita su misura per fare ciò che volete e soltanto quello. Il sistema è più efficiente, più elegante e meno portato al genere di errore dovuto all'errata disposizione degli argomenti di chiamata.
<< Le particolarità degli operatori and e or |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
Unire il tutto >> |