Python permet une syntaxe
intéressante qui vous laisse définir des mini-fonctions d’une ligne à
la volée. Empruntées à Lisp, ces fonctions
dites lambda peuvent être employées partout où une
fonction est nécéssaire.
4.7.1. Les fonctions lambda dans le monde réel
Il y a plusieurs chose à noter ici. D’abord, nous utilisons la
forme simple de l’astuce and-or, ce qui est
sûr car une fonction lambda vaut toujours vrai dans un contexte booléen. (Cela ne veut pas
dire qu’une fonction lambda ne peut retourner faux.
La fonction est toujours vrai, sa valeur de retour peut être vrai ou
fausse.)
Ensuite, nous utilisons la fonction split
sans arguments. Vous l’avez déjà vu employée avec un ou deux arguments, sans
arguments elle utilise les espaces comme séparateur.
Exemple 4.21. split sans arguments
>>> 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'
|
Voici une chaîne multi-lignes définie à l’aide de caractères
d’échappement au lieu de triples guillemets.
\n est le retour chariot et
\t le caractère de tabulation.
|
|
split sans arguments fait la séparation
sur les espaces. Trois espaces, un retour chariot ou un caractère
de tabulation reviennent à la même chose.
|
|
Vous pouvez normaliser les espaces en utilisant
split sur une chaîne et en la joignant par
join avec un espace simple comme délimiteur.
C’est ce que fait la fonction info pour
replier les doc string sur une seule
ligne.
|
Mais que fait donc exactement cette fonction
info avec ces fonctions lambda,
ces split et ces astuces and-or ?
processFunc est maintenant une fonction, mais
la fonction qu’elle est dépend de la valeur de la variable
collapse. Si collapse vaut vrai,
processFunc(string)
repliera les espaces, sinon,
processFunc(string)
retournera son argument sans le modifier.
Pour faire la même chose dans un langage moins robuste, tel que
Visual Basic, vous auriez sans doute créé une
fonction prenant une chaîne et un argument
collapse qui aurait utilisé une instruction
if pour décider de replier les espaces ou non, puis
aurait retourné la valeur appropriée. Cela serait inefficace car la
fonction devrait prendre en compte tous les cas possibles. A chaque fois
que vous l’appeleriez, elle devrait décider si elle doit replier
l’espace avant de pouvoir vous donner ce que vous souhaitez. En
Python, vous pouvez retirer cette prise de
décision de la fonction et définir une fonction
lambda taillée sur mesure pour vous donner ce que
vous voulez et seulement cela. C’est plus efficace, plus élégant et
moins sujet à des erreurs dans l’ordre des arguments.
Pour en savoir plus sur les fonctions lambda