Python Fonctions Lambda avec EXEMPLES
Qu'est-ce que la fonction Lambda dans Python?
A Fonction Lambda dans Python la programmation est une fonction anonyme ou une fonction n'ayant pas de nom. Il s'agit d'une fonction petite et restreinte ne comportant pas plus d'une ligne. Tout comme une fonction normale, une fonction Lambda peut avoir plusieurs arguments avec une seule expression.
In Python, les expressions lambda (ou formes lambda) sont utilisรฉes pour construire des fonctions anonymes. Pour ce faire, vous utiliserez le lambda mot-clรฉ (tout comme vous utilisez def pour dรฉfinir les fonctions normales). Chaque fonction anonyme que vous dรฉfinissez dans Python comportera 3 parties essentielles :
- Le mot-clรฉ lambda.
- Les paramรจtres (ou variables liรฉes), et
- Le corps fonctionnel.
Une fonction lambda peut avoir n'importe quel nombre de paramรจtres, mais le corps de la fonction ne peut contenir que UN expression. De plus, un lambda est รฉcrit sur une seule ligne de code et peut รฉgalement รชtre invoquรฉ immรฉdiatement. Vous verrez tout cela en action dans les exemples ร venir.
Syntaxe et exemples
La syntaxe formelle pour รฉcrire une fonction lambda est la suivante :
lambda p1, p2: expression
Ici, p1 et p2 sont les paramรจtres qui sont transmis ร la fonction lambda. Vous pouvez ajouter autant ou peu de paramรจtres que nรฉcessaire.
Cependant, notez que nous nโutilisons pas de crochets autour des paramรจtres comme nous le faisons avec les fonctions normales. La derniรจre partie (expression) est toute expression Python valide qui opรจre sur les paramรจtres que vous fournissez ร la fonction.
Exemple 1
Maintenant que vous connaissez les lambdas, essayons avec un exemple. Alors, ouvrez votre IDLE et saisissez ce qui suit :
adder = lambda x, y: x + y print (adder (1, 2))
Voici la sortie:
3
Explication du code
Ici, nous dรฉfinissons une variable qui contiendra le rรฉsultat renvoyรฉ par la fonction lambda.
1. Le mot-clรฉ lambda utilisรฉ pour dรฉfinir une fonction anonyme.
2. x et y sont les paramรจtres que nous transmettons ร la fonction lambda.
3. C'est le corps de la fonction, qui ajoute les 2 paramรจtres que nous avons passรฉs. Notez qu'il s'agit d'une seule expression. Vous ne pouvez pas รฉcrire plusieurs instructions dans le corps d'une fonction lambda.
4. Nous appelons la fonction et imprimons la valeur renvoyรฉe.
Exemple 2
C'รฉtait un exemple de base pour comprendre les principes fondamentaux et la syntaxe de lambda. Essayons maintenant d'imprimer un lambda et voyons le rรฉsultat. Encore une fois, ouvrez votre IDLE et saisissez ce qui suit :
#What a lambda returns string='some kind of a useless lambda' print(lambda string : print(string))
Enregistrez maintenant votre fichier et appuyez sur F5 pour exรฉcuter le programme. C'est le rรฉsultat que vous devriez obtenir.
Sortie :
<function <lambda> at 0x00000185C3BF81E0>
Qu'est-ce qu'il se passe ici? Regardons le code pour mieux comprendre.
Explication du code
- Ici, nous dรฉfinissons un string que vous passerez en paramรจtre au lambda.
- Nous dรฉclarons un lambda qui appelle une instruction print et imprime le rรฉsultat.
Mais pourquoi le programme n'imprime-t-il pas la chaรฎne que nous transmettons ? En effet, le lambda lui-mรชme renvoie un objet fonction. Dans cet exemple, le lambda n'est pas appelรฉ par la fonction d'impression mais simplement retour l'objet fonction et l'emplacement mรฉmoire oรน il est stockรฉ. C'est ce qui est imprimรฉ sur la console.
Exemple 3
Cependant, si vous รฉcrivez un programme comme celui-ci :
#What a lambda returns #2 x="some kind of a useless lambda" (lambda x : print(x))(x)
Et exรฉcutez-le en appuyant sur F5, vous verrez une sortie comme celle-ci.
Sortie :
some kind of a useless lambda
Maintenant, le lambda est appelรฉ et la chaรฎne que nous transmettons est imprimรฉe sur la console. Mais quelle est cette syntaxe รฉtrange, et pourquoi la dรฉfinition lambda est-elle mise entre parenthรจses ? Comprenons cela maintenant.
Explication du code
- Voici la mรชme chaรฎne que nous avons dรฉfinie dans l'exemple prรฉcรฉdent.
- Dans cette partie, nous dรฉfinissons un lambda et l'appelons immรฉdiatement en passant la chaรฎne comme argument. C'est ce qu'on appelle un IIFE, et vous en apprendrez plus ร ce sujet dans les prochaines sections de ce didacticiel.
Exemple 4
Regardons un dernier exemple pour comprendre comment les lambdas et les fonctions rรฉguliรจres sont exรฉcutรฉes. Alors, ouvrez votre IDLE et dans un nouveau fichier, saisissez ce qui suit :
#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'))
Maintenant, enregistrez le fichier et appuyez sur F5 pour exรฉcuter le programme. Si vous nโavez commis aucune erreur, le rรฉsultat devrait ressembler ร ceci.
Sortie :
printer 1 REGULAR CALL printer 2 REGULAR CALL printer 1 LAMBDA CALL printer 2 LAMBDA CALL
Explication du code
- Une fonction appelรฉe gourou qui prend une autre fonction comme premier paramรจtre et tout autre argument qui la suit.
- Printer_one est une fonction simple qui imprime le paramรจtre qui lui est passรฉ et le renvoie.
- Printer_two est similaire ร Printer_one mais sans l'instruction return.
- Dans cette partie, nous appelons la fonction gourou et passons les fonctions d'imprimante et une chaรฎne comme paramรจtres.
- C'est la syntaxe pour rรฉaliser la quatriรจme รฉtape (c'est-ร -dire appeler la fonction gourou) mais en utilisant des lambdas.
Dans la section suivante, vous apprendrez ร utiliser les fonctions lambda avec carte(), rรฉduire(), et filtre() in Python.
Utiliser des lambdas avec Python intรฉgrรฉs
Les fonctions Lambda offrent un moyen รฉlรฉgant et puissant d'effectuer des opรฉrations ร l'aide de mรฉthodes intรฉgrรฉes dans Python. C'est possible car les lambdas peuvent รชtre invoquรฉs immรฉdiatement et passรฉs en argument ร ces fonctions.
IIFE en Python Lambda
IIFE qui veut dire exรฉcution de la fonction immรฉdiatement invoquรฉe. Cela signifie qu'une fonction lambda est appelable dรจs qu'elle est dรฉfinie. Comprenons cela avec un exemple ; allumez votre IDLE et saisissez ce qui suit :
(lambda x: x + x)(2)
Voici le rรฉsultat et l'explication du code :
Cette capacitรฉ des lambdas ร รชtre invoquรฉes immรฉdiatement vous permet de les utiliser dans des fonctions comme map() et rรฉduire(). C'est utile car vous ne souhaiterez peut-รชtre plus utiliser ces fonctions.
lambdas dans le filtre()
La fonction de filtre est utilisรฉe pour sรฉlectionner certains รฉlรฉments particuliers dans une sรฉquence d'รฉlรฉments. La sรฉquence peut รชtre n'importe quel itรฉrateur comme des listes, des ensembles, des tuples, etc.
Les รฉlรฉments qui seront sรฉlectionnรฉs sont basรฉs sur une contrainte prรฉdรฉfinie. Il faut 2 paramรจtres :
- Une fonction qui dรฉfinit la contrainte de filtrage
- Une sรฉquence (tout itรฉrateur comme des listes, des tuples, etc.)
Par exemple,
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = filter (lambda x: x > 4, sequences) print(list(filtered_result))
Voici la sortie:
[10, 8, 7, 5, 11]
Explication du code :
1. Dans la premiรจre instruction, nous dรฉfinissons une liste appelรฉe sรฉquences qui contient des nombres.
2. Ici, nous dรฉclarons une variable appelรฉe filtered_result, qui stockera les valeurs filtrรฉes renvoyรฉes par la fonction filter().
3. Une fonction lambda qui s'exรฉcute sur chaque รฉlรฉment de la liste et renvoie vrai s'il est supรฉrieur ร 4.
4. Imprime le rรฉsultat renvoyรฉ par la fonction de filtre.
lambdas dans la carte()
la fonction map est utilisรฉe pour appliquer une opรฉration particuliรจre ร chaque รฉlรฉment d'une sรฉquence. Comme filter(), il prend รฉgalement 2 paramรจtres :
- Une fonction qui dรฉfinit l'opรฉration ร effectuer sur les รฉlรฉments
- Une ou plusieurs sรฉquences
Par exemple, voici un programme qui imprime les carrรฉs des nombres dans une liste donnรฉe :
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = map (lambda x: x*x, sequences) print(list(filtered_result))
Sortie :
[100, 4, 64, 49, 25, 16, 9, 121, 0, 1]
[KR1]
Explication du code :
- Ici, nous dรฉfinissons une liste appelรฉe sรฉquences qui contient quelques nombres.
- Nous dรฉclarons une variable appelรฉe filtered_result qui stockera les valeurs mappรฉes
- Une fonction lambda qui s'exรฉcute sur chaque รฉlรฉment de la liste et renvoie le carrรฉ de ce nombre.
- Imprime le rรฉsultat renvoyรฉ par la fonction map.
lambdas dans rรฉduire()
La fonction de rรฉduction, comme map(), est utilisรฉe pour appliquer une opรฉration ร chaque รฉlรฉment d'une sรฉquence. Cependant, elle diffรจre de la carte dans son fonctionnement. Voici les รฉtapes suivies par la fonction rรฉduire() pour calculer une sortie :
รtape 1) Effectuez l'opรฉration dรฉfinie sur les 2 premiers รฉlรฉments de la sรฉquence.
รtape 2) Enregistrez ce rรฉsultat
รtape 3) Effectuez l'opรฉration avec le rรฉsultat enregistrรฉ et l'รฉlรฉment suivant dans la sรฉquence.
รtape 4) Rรฉpรฉtez jusquโร ce quโil ne reste plus dโรฉlรฉments.
Il faut รฉgalement deux paramรจtres :
- Une fonction qui dรฉfinit l'opรฉration ร effectuer
- Une sรฉquence (tout itรฉrateur comme des listes, des tuples, etc.)
Par exemple, voici un programme qui renvoie le produit de tous les รฉlรฉments d'une liste :
from functools import reduce sequences = [1,2,3,4,5] product = reduce (lambda x, y: x*y, sequences) print(product)
Voici la sortie:
120
Explication du code :
- Importer rรฉduire depuis le module functools
- Ici, nous dรฉfinissons une liste appelรฉe sรฉquences qui contient quelques nombres.
- On dรฉclare une variable appelรฉe product qui stockera la valeur rรฉduite
- Une fonction lambda qui s'exรฉcute sur chaque รฉlรฉment de la liste. Il renverra le produit de ce nombre selon le rรฉsultat prรฉcรฉdent.
- Imprime le rรฉsultat renvoyรฉ par la fonction de rรฉduction.
Pourquoi (et pourquoi pas) utiliser les fonctions lambda ?
Comme vous le verrez dans la section suivante, les lambdas sont traitรฉes de la mรชme maniรจre que les fonctions normales au niveau de l'interprรจte. D'une certaine maniรจre, on pourrait dire que les lambdas fournissent une syntaxe compacte pour รฉcrire des fonctions qui renvoient une seule expression.
Cependant, vous devez savoir quand c'est une bonne idรฉe d'utiliser des lambdas et quand les รฉviter. Dans cette section, vous apprendrez certains des principes de conception utilisรฉs par les dรฉveloppeurs Python lors de l'รฉcriture de lambdas.
L'un des cas d'utilisation les plus courants des lambdas concerne la programmation fonctionnelle. Python prend en charge un paradigme (ou un style) de programmation appelรฉ programmation fonctionnelle.
Il permet de fournir une fonction en paramรจtre ร une autre fonction (par exemple, dans une carte, un filtre, etc.). Dans de tels cas, l'utilisation de lambdas offre un moyen รฉlรฉgant de crรฉer une fonction unique et de la transmettre en paramรจtre.
Quand ne faut-il pas utiliser Lambda ?
Vous ne devriez jamais รฉcrire de fonctions lambda compliquรฉes dans un environnement de production. Il sera trรจs difficile pour les codeurs qui maintiennent votre code de le dรฉcrypter. Si vous vous retrouvez ร crรฉer des expressions complexes sur une seule ligne, ce serait une pratique bien supรฉrieure de dรฉfinir une fonction appropriรฉe. En tant que bonne pratique, vous devez vous rappeler quโun code simple est toujours meilleur quโun code complexe.
Fonctions Lambdas et fonctions rรฉguliรจres
Comme indiquรฉ prรฉcรฉdemment, les lambdas ne sont que des fonctions auxquelles aucun identifiant n'est liรฉ. En termes plus simples, ce sont des fonctions sans nom (donc anonymes). Voici un tableau pour illustrer la diffรฉrence entre les lambdas et les fonctions rรฉguliรจres en python.
Lambda
Fonctions rรฉguliรจres
syntaxe:
lambda x : x + x
syntaxe:
def (x) : return x + x
Les fonctions lambda ne peuvent avoir quโune seule expression dans leur corps.
Les fonctions rรฉguliรจres peuvent avoir plusieurs expressions et instructions dans leur corps.
Les lambdas ne sont pas associรฉs ร un nom. C'est pourquoi elles sont รฉgalement appelรฉes fonctions anonymes.
Les fonctions rรฉguliรจres doivent avoir un nom et une signature.
Les lambdas ne contiennent pas d'instruction return car le corps est automatiquement renvoyรฉ.
Les fonctions qui doivent renvoyer une valeur doivent inclure une instruction return.
Explication des diffรฉrences ?
La principale diffรฉrence entre une fonction lambda et une fonction rรฉguliรจre est que la fonction lambda n'รฉvalue qu'une seule expression et gรฉnรจre un objet fonction. Par consรฉquent, nous pouvons nommer le rรฉsultat de la fonction lambda et l'utiliser dans notre programme comme nous l'avons fait dans l'exemple prรฉcรฉdent.
Une fonction rรฉguliรจre pour l'exemple ci-dessus ressemblerait ร ceci :
def adder (x, y): return x + y print (adder (1, 2))
Ici, nous devons dรฉfinir un Le nom pour la fonction qui Retours le rรฉsultat quand nous nous appeler Une fonction lambda ne contient pas d'instruction de retour car elle n'aura qu'une seule expression qui est toujours renvoyรฉe par dรฉfaut. Vous n'avez mรชme pas besoin d'assigner une fonction lambda car elle peut รชtre immรฉdiatement invoquรฉe (voir la section suivante). Comme vous le verrez dans l'exemple suivant, les fonctions lambda deviennent particuliรจrement puissantes lorsque nous les utilisons avec Pythonles fonctions intรฉgrรฉes de.
Cependant, vous vous demandez peut-รชtre encore en quoi les lambdas sont diffรฉrents d'une fonction qui renvoie une seule expression (comme celle ci-dessus). Au niveau des interprรจtes, il nโy a pas beaucoup de diffรฉrence. Cela peut paraรฎtre surprenant, mais toute fonction lambda que vous dรฉfinissez dans Python est traitรฉe comme une fonction normale par l'interprรจte.
Comme vous pouvez le voir sur le diagramme, les deux dรฉfinitions sont traitรฉes de la mรชme maniรจre par l'interprรฉteur Python lorsqu'elles sont converties en bytecode. Maintenant, vous ne pouvez pas nommer une fonction lambda car il est rรฉservรฉ par Python, mais tout autre nom de fonction donnera le mรชme bytecode[KR6].
Rรฉsumรฉ
- Les lambdas, รฉgalement connues sous le nom de fonctions anonymes, sont de petites fonctions restreintes qui n'ont pas besoin de nom (c'est-ร -dire d'identifiant).
- Chaque fonction lambda dans Python comporte 3 parties essentielles :
- Le mot-clรฉ lambda.
- Les paramรจtres (ou variables liรฉes), et
- Le corps fonctionnel.
- La syntaxe pour รฉcrire un lambda est : paramรจtre lambda : expression
- Les lambdas peuvent avoir n'importe quel nombre de paramรจtres, mais ils ne sont pas entourรฉs d'accolades
- Un lambda ne peut avoir qu'une seule expression dans son corps de fonction, qui est renvoyรฉe par dรฉfaut.
- Au niveau du bytecode, il n'y a pas beaucoup de diffรฉrence entre la faรงon dont les lambdas et les fonctions rรฉguliรจres sont gรฉrรฉes par l'interprรฉteur.
- Lambdas prend en charge IIFE via cette syntaxe : (paramรจtre lambda : expression)(argument)
- Les Lambdas sont couramment utilisรฉs avec les รฉlรฉments Python intรฉgrรฉs suivants :
- Filtre : filtre (paramรจtre lambda : expression, sรฉquence itรฉrable)
- Map : map (paramรจtre lambda : expression, sรฉquences itรฉrables)
- Rรฉduire : rรฉduire (paramรจtre lambda 1, paramรจtre 2 : expression, sรฉquence itรฉrable)
- N'รฉcrivez pas de fonctions lambda compliquรฉes dans un environnement de production car cela sera difficile pour les responsables du code.
[J5]J'ai ajoutรฉ un tableau, mais l'explication est nรฉcessaire pour comprendre les diffรฉrences.
