Recherche de site Web

Expressions Lambda en Python expliquées avec des exemples


Introduction

Une expression lambda en Python est une fonction anonyme et en ligne définie avec le mot clé lambda, idéale pour des opérations courtes et en une seule ligne passées comme arguments—en particulier aux fonctions d'ordre supérieur telles que map, filter et sorted. Utilisez les lambdas pour une logique concise, mais passez à def lorsque la lisibilité ou la réutilisabilité est importante.

Cette syntaxe concise est particulièrement utile pour les data scientists, analystes et développeurs travaillant avec de grands ensembles de données ou des algorithmes complexes, car elle simplifie le processus d'application des transformations ou des critères de filtrage.

Points clés

  • Définition de lambda : lambda <params> : <expression> crée un objet fonction anonyme qui exécute l'expression uniquement lorsqu'il est appelé, renvoyant la valeur calculée.
  • Principales utilisations : Les fonctions Lambda excellent dans les fonctions d'ordre supérieur comme map, filter, reduce et sorted, ainsi que dans les gestionnaires d'événements GUI et les flux de traitement de données.
  • Lisibilité vs. concision : Les expressions lambda offrent une syntaxe concise pour les opérations simples, mais les fonctions traditionnelles def assurent une meilleure clarté et maintenabilité pour une logique complexe.
  • Performance : Les fonctions lambda et les fonctions régulières ont des vitesses d'exécution presque identiques en Python, privilégiant la clarté et la maintenabilité du code par rapport à l'optimisation des performances.
  • Pièges courants : Évitez les expressions lambda trop complexes et les problèmes de liaison tardive dans les boucles.
  • Différences entre Lambda et def : Les fonctions Lambda sont des fonctions anonymes à expression unique, tandis que def crée des fonctions nommées avec des capacités complètes de débogage et plusieurs instructions.
  • Bonnes pratiques avec Lambda : Utilisez les fonctions lambda pour des transformations de données simples, des opérations de filtrage et le passage de fonctions en tant qu'arguments, en évitant une logique complexe et les situations nécessitant un débogage approfondi.

Prérequis

Avant de plonger dans les détails des expressions lambda, assurons-nous que vous disposez des prérequis suivants :

  • Python 3.7+ installé (tous les exemples utilisent la syntaxe 3.x).

  • Compréhension de base des fonctions et des objets itérables en Python.

Qu'est-ce qu'une expression Lambda ?

Une expression lambda est un moyen concis de définir une petite fonction anonyme (sans nom) en Python. Elle peut prendre n'importe quel nombre d'arguments, mais ne peut contenir qu'une seule expression. Cette expression est évaluée et renvoyée lorsque la fonction lambda est appelée. Les fonctions lambda sont particulièrement utiles lorsque vous devez passer une fonction en tant qu'argument à une autre fonction, comme map, filter ou sorted.

Les lambdas sont des objets de première classe : vous pouvez les passer en arguments, les retourner depuis d'autres fonctions et les assigner à des variables.

La syntaxe d'une expression lambda est la suivante :

lambda arguments: expression

Voici un exemple d'une expression lambda simple qui prend un seul argument x et renvoie son carré :

square = lambda x: x**2  # returns a function object
print(square(5))  # Output: 25

Dans cet exemple, l'expression lambda lambda x: x**2 est affectée à la variable square. Lorsque nous appelons square(5), l'expression lambda est évaluée avec x égal à 5, et le résultat 25 est renvoyé.

Syntaxe Lambda et Valeur de Retour

La syntaxe lambda est un moyen concis de définir une fonction en Python. Elle se compose de la structure suivante :

lambda <param1>, <param2>, ... : <single expression>

Ici, <param1>, <param2>, etc., sont les paramètres de la fonction lambda, et <single expression> est l'opération qui sera effectuée sur ces paramètres.

Un aspect clé des fonctions lambda est que l'expression n'est évaluée que lorsque la lambda est appelée, et non lorsqu'elle est définie. Cela signifie que la fonction lambda ne s'exécute pas immédiatement lorsqu'elle est créée, mais seulement lorsqu'elle est invoquée avec des arguments.

La valeur de l'expression devient la valeur de retour de la fonction lambda. Il est à noter qu'il n'est pas nécessaire d'utiliser le mot-clé return dans une fonction lambda, car le résultat de l'expression est retourné implicitement.

Quelle est la différence entre lambda et def ?

lambda et def sont tous deux utilisés pour définir des fonctions en Python, mais ils ont des objectifs différents et des caractéristiques distinctes. Voici un résumé des principales différences :

Fonctionnalitélambdadef
Syntaxe
lambda arguments: expression
def function_name(arguments):
FonctionnalitéAnonyme (sans nom), fonctions à expression uniqueFonctions nommées à expressions multiples
LisibilitéConcise, mais peut être moins lisible pour une logique complexePlus verbeux, mais plus facile à lire pour une logique complexe
RéutilisabilitéRéutilisabilité limitée en raison de l'anonymatRéutilisabilité accrue grâce à la dénomination
Cas d'utilisationIdéal pour des fonctions courtes à usage unique, comme dans map, filter et sortedConvient aux fonctions plus complexes et réutilisables

Voici un exemple montrant la différence de syntaxe et de fonctionnalité :

Exemple Lambda

# Using lambda to define a simple function
double = lambda x: x * 2
print(double(5))  # Output: 10

Exemple de définition

# Using def to define a more complex function
def double(x):
    return x * 2
print(double(5))  # Output: 10

Dans l'exemple lambda, nous définissons une fonction anonyme qui prend un seul argument x et renvoie son double. C'est une manière concise de définir une fonction simple, mais elle est limitée dans sa réutilisabilité en raison de son anonymat.

Dans l'exemple def, nous définissons une fonction nommée double qui prend un seul argument x et renvoie son double. Cette approche est plus verbeuse, mais elle permet une meilleure lisibilité et une plus grande réutilisabilité grâce au nom de la fonction.

En résumé, lors du choix entre lambda et def, considérez la complexité et la réutilisabilité de la fonction que vous devez définir. Si vous avez besoin d'une fonction simple et à usage unique, lambda pourrait être le meilleur choix. Pour des fonctions plus complexes ou réutilisables, def est généralement une meilleure option.

Utilisez lambda pour de petites fonctions jetables. Passez à def lorsque la logique devient plus complexe ou que la réutilisation est probable.

Quels sont quelques cas d'utilisation courants des expressions lambda ?

1. Utilisation de lambda avec map

Les fonctions lambda peuvent être utilisées avec map pour appliquer une transformation à chaque élément d'un itérable. Voici un exemple d'utilisation de lambda pour élever au carré chaque nombre d'une liste :

numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x**2, numbers))
print(squared_numbers)  # Output: [1, 4, 9, 16, 25]
[1, 4, 9, 16, 25]

2. Utilisation de lambda avec filter

Les fonctions lambda peuvent être utilisées avec filter pour filtrer des éléments d'un itérable en fonction d'une condition. Voici un exemple d'utilisation de lambda pour filtrer les nombres pairs d'une liste :

numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # Output: [2, 4]
[2, 4]

3. Utilisation de lambda avec sorted

Les fonctions lambda peuvent être utilisées avec sorted pour trier les éléments d'un itérable en fonction d'une clé personnalisée. Voici un exemple d'utilisation de lambda pour trier une liste de chaînes par leur longueur :

strings = ['apple', 'banana', 'cherry', 'date']
sorted_strings = sorted(strings, key=lambda x: len(x))
print(sorted_strings)  # Output: ['date', 'apple', 'cherry', 'banana']
['date', 'apple', 'cherry', 'banana']

4. Utilisation de lambda avec reduce

Les fonctions lambda peuvent être utilisées avec reduce du module functools pour réduire un itérable à une seule sortie. Voici un exemple d'utilisation de lambda pour additionner tous les éléments d'une liste :

from functools import reduce

numbers = [1, 2, 3, 4, 5]
sum_of_numbers = reduce(lambda x, y: x + y, numbers)
print(sum_of_numbers)  # Output: 15
15

5. Utilisation de lambda avec zip

Les fonctions lambda peuvent être utilisées avec zip pour combiner des éléments de plusieurs itérables. Voici un exemple d'utilisation de lambda pour combiner deux listes en une liste de tuples :

list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
combined = list(zip(list1, list2))
print(combined)  # Output: [(1, 'a'), (2, 'b'), (3, 'c')]
[(1, 'a'), (2, 'b'), (3, 'c')]

6. Utiliser lambda avec enumerate

Les fonctions lambda peuvent être utilisées avec enumerate pour itérer sur un itérable en ayant à la fois l'indice et la valeur. Voici un exemple d'utilisation de lambda pour créer une liste de tuples contenant l'indice et la valeur de chaque élément d'une liste :

numbers = [1, 2, 3, 4, 5]
indexed_numbers = list(enumerate(numbers))
print(indexed_numbers)  # Output: [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]

7. Utiliser lambda avec itertools

Les fonctions lambda peuvent être utilisées avec diverses fonctions du module itertools pour effectuer des opérations complexes sur des itérables. Voici un exemple d'utilisation de lambda avec groupby pour regrouper des éléments dans une liste en fonction d'une condition :

from itertools import groupby

numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
grouped_numbers = [(k, len(list(g))) for k, g in groupby(numbers)]
print(grouped_numbers)  # Output: [(1, 1), (2, 2), (3, 3), (4, 4)]
[(1, 1), (2, 2), (3, 3), (4, 4)]

8. Utilisation de lambda avec functools

Les fonctions lambda peuvent être utilisées avec diverses fonctions du module functools pour effectuer des opérations complexes sur des itérables. Voici un exemple d'utilisation de lambda avec reduce pour additionner tous les éléments d'une liste :

from functools import reduce

numbers = [1, 2, 3, 4, 5]
sum_of_numbers = reduce(lambda x, y: x + y, numbers)
print(sum_of_numbers)  # Output: 15
15

Quelles sont les fonctions lambda imbriquées en Python ?

Les fonctions lambda imbriquées en Python sont des fonctions lambda définies à l'intérieur d'autres fonctions lambda. Cela permet de créer des fonctions plus complexes en combinant plusieurs fonctions lambda. Les fonctions lambda imbriquées peuvent être particulièrement utiles lorsque vous devez générer dynamiquement des fonctions en fonction de certaines conditions ou paramètres.

Voici un exemple d'une fonction lambda imbriquée qui prend deux arguments et renvoie la somme de leurs carrés :

adder = lambda x: (lambda y: x**2 + y**2)
print(adder(10)(5))  # 125
125

Un exemple plus complexe et utile de fonctions lambda imbriquées consiste à créer une fonction qui génère dynamiquement une fonction pour calculer le nème nombre de Fibonacci. Cet exemple montre comment les fonctions lambda imbriquées peuvent être utilisées pour créer une fonction d'ordre supérieur qui renvoie une autre fonction.

fibonacci_generator = lambda n: (lambda x: x if n <= 1 else fibonacci_generator(n-1)(x-1) + fibonacci_generator(n-2)(x-2))
fibonacci = fibonacci_generator(10)
print(fibonacci(10))  # 55
55

Dans cet exemple, la fonction fibonacci_generator prend un entier n et renvoie une fonction lambda qui calcule le nième nombre de Fibonacci. La fonction lambda renvoyée utilise la récursion pour calculer le nombre de Fibonacci. Cela démontre comment des fonctions lambda imbriquées peuvent être utilisées pour créer des fonctions complexes et dynamiques en Python.

Quelles sont les fonctions lambda conditionnelles en Python ?

Les fonctions lambda conditionnelles en Python sont des fonctions lambda qui utilisent des instructions conditionnelles pour déterminer le résultat en fonction de certaines conditions. Elles sont particulièrement utiles lorsque vous devez effectuer différentes opérations ou renvoyer différentes valeurs en fonction de conditions spécifiques.

Voici un exemple simple d'une fonction lambda conditionnelle qui détermine le signe d'un nombre :

sign = lambda n: 'positive' if n > 0 else 'zero' if n == 0 else 'negative'
print(sign(-4))  # negative

Un cas d'utilisation plus complexe et concret des fonctions lambda conditionnelles se trouve dans le traitement et l'analyse des données. Par exemple, supposons que vous ayez une liste d'étudiants avec leurs notes et que vous souhaitiez les catégoriser en fonction de leurs performances. Vous pouvez utiliser une fonction lambda conditionnelle pour créer une fonction de catégorisation qui attribue une catégorie en fonction de la note.

categorize_student = lambda grade: 'Distinction' if grade >= 90 else 'Merit' if grade >= 80 else 'Pass' if grade >= 70 else 'Fail'
students = [
    {'name': 'Alice', 'grade': 95},
    {'name': 'Bob', 'grade': 75},
    {'name': 'Charlie', 'grade': 60},
    {'name': 'David', 'grade': 85}
]

for student in students:
    print(f"{student['name']}: {categorize_student(student['grade'])}")

Cet exemple montre comment des fonctions lambda conditionnelles peuvent être utilisées pour catégoriser dynamiquement les données en fonction de conditions spécifiques, en faisant un outil puissant pour l'analyse et le traitement des données.

Alice: Distinction
Bob: Pass
Charlie: Fail
David: Merit

Quand éviter les fonctions lambda ?

Les fonctions lambda sont un outil puissant en Python, mais elles ne sont pas toujours le meilleur choix. Voici quelques scénarios où il est préférable d'éviter d'utiliser des fonctions lambda :

ScénarioDescription
Logique ComplexeLes fonctions lambda conviennent mieux aux opérations simples sur une seule ligne. Si votre logique est complexe, impliquant plusieurs lignes de code ou des conditions imbriquées, il est préférable de définir une fonction régulière pour la lisibilité et la maintenabilité.
DébogageLes fonctions lambda peuvent être difficiles à déboguer en raison de leur nature concise. Si vous devez déboguer une fonction, une fonction régulière avec un nom clair et une docstring est plus appropriée.
RéutilisabilitéBien que les fonctions lambda puissent être réutilisées, elles ne sont pas aussi explicites que les fonctions régulières. Si vous devez réutiliser une fonction dans plusieurs parties de votre code, envisagez de définir une fonction régulière pour une meilleure organisation du code.
DocumentationLes fonctions lambda ne supportent pas les docstrings, ce qui rend plus difficile pour les autres (et pour vous-même) de comprendre leur but et leur comportement. Pour les fonctions nécessitant une documentation, utilisez des fonctions classiques.
Code Critique pour la PerformanceDans les sections critiques pour la performance de votre code, les fonctions lambda peuvent introduire un léger surcoût en raison de leur nature dynamique. Dans de tels cas, envisagez d'utiliser des fonctions régulières ou d'optimiser votre code d'autres manières.
LisibilitéSi votre fonction lambda est trop longue ou complexe, cela peut nuire à la lisibilité du code. Dans ce cas, décomposez la logique en morceaux plus petits et plus faciles à gérer, ou utilisez une fonction normale.
Annotations de typeLes fonctions lambda ne prennent pas en charge les annotations de type explicites, ce qui rend plus difficile la compréhension des types d'entrée et de sortie attendus. Si des annotations de type sont nécessaires, envisagez d'utiliser une fonction normale avec des indices de type.

N'oubliez pas que les fonctions lambda sont un outil et, comme tout outil, elles doivent être utilisées avec discernement. En comprenant quand utiliser et éviter les fonctions lambda, vous pouvez écrire un code plus efficace, lisible et facile à maintenir.

Quelles sont les erreurs courantes à éviter lors de l'utilisation des fonctions lambda ?

Lors de l'utilisation des fonctions lambda, il est essentiel de connaître les pièges courants qui peuvent entraîner des erreurs, des problèmes de lisibilité ou des problèmes de performance. Voici quelques erreurs courantes à éviter, accompagnées d'exemples et de solutions :

ErreurExempleRéparer
Logique intégrée excessivement complexe
lambda x: (x ** 2 + 2 * x - 5) / (x - 3)
Utilisez def + des commentaires pour la lisibilité et la maintenabilité.
Prévoir plusieurs déclarationslambda x: print(x); x+1 (Erreur de syntaxe)Utilisez une fonction normale pour une logique complexe ou plusieurs instructions.
Liage tardif dans les boucles
[lambda: i for i in range(3)] → all 2
Utilisez des valeurs d'argument par défaut pour capturer la variable de boucle actuelle : [lambda i=i: i for i in range(3)].
Capture de variable non intentionnellelambda x: x + y où y n'est pas définiAssurez-vous que toutes les variables sont définies au sein de la fonction lambda ou de sa portée.
Abuser de lambda comme substitut à def
lambda x: x + 1 instead of def add_one(x): return x + 1
Utilisez def pour les fonctions qui nécessitent une documentation, des annotations de type ou qui sont critiques en termes de performance.
Ignorer les limites de lambdalambda x: si x > 0: retourne 'positif'; sinon: retourne 'négatif' (SyntaxError)Soyez conscient des limites des lambdas, comme le fait qu'elles ne supportent pas les instructions if-else ni les blocs try-except.
Abuser des fonctions lambda pour la lisibilité
lambda x: x**2 if x > 0 else x**3 if x < 0 else 0
Divisez une logique complexe en fonctions plus petites et plus lisibles, ou utilisez une fonction normale pour une meilleure lisibilité.

Considérations de performance

Les fonctions lambda et def se compilent en objets Function ; la vitesse d'exécution est pratiquement identique.

Les fonctions lambda sont généralement plus rapides que les fonctions régulières car elles sont compilées à l'exécution, mais il y a certaines réserves à prendre en compte :

ConsidérationDescription
Surcharge des appels de fonctionLes fonctions lambda entraînent une légère surcharge par rapport aux fonctions régulières en raison de leur nature dynamique. Pour des fonctions très petites, cette surcharge peut être significative.
Utilisation de la mémoireLes fonctions lambda sont stockées en mémoire en tant qu'objets, ce qui peut augmenter l'utilisation de la mémoire. Pour un grand nombre de petites fonctions lambda, cela peut devenir préoccupant.
Vérification de typeLes fonctions lambda ne prennent pas en charge les annotations de type, ce qui peut rendre plus difficile la compréhension des types d'entrée et de sortie attendus. Cela peut entraîner des erreurs d'exécution si des types incorrects sont passés.

Voici un simple benchmark pour comparer la performance des fonctions lambda et def :

import timeit

# Measuring the execution time of a lambda function
lambda_time = timeit.timeit("(lambda x: x+1)(5)", number=1_000_000)

# Measuring the execution time of a regular function defined with 'def'
def_time = timeit.timeit("def f(x):\n return x+1\nf(5)", number=1_000_000)

# Printing the results
print(f"Lambda function time: {lambda_time}")
print(f"Def function time: {def_time}")
Lambda function time: 0.7615251350071048
Def function time: 0.8852231259952532

FAQs

1. Qu'est-ce qu'une expression Lambda en Python ?

Une expression lambda en Python est une façon concise de définir une petite fonction anonyme (sans nom). C'est une abréviation pour une fonction qui peut prendre n'importe quel nombre d'arguments, mais ne peut avoir qu'une seule expression. Les fonctions lambda sont souvent utilisées lorsqu'une petite fonction à usage unique est nécessaire.

Exemple :

lambda x: x**2  # A lambda function that squares its input

2. Une expression lambda peut-elle avoir plusieurs lignes ?

Non, une expression lambda ne peut pas comporter plusieurs lignes. Elle est limitée à une seule expression. Si vous avez besoin d'une fonction avec plusieurs lignes, vous devriez utiliser une fonction normale définie avec def.

Exemple :

# This is not allowed
lambda x:
    print(x)
    return x**2

# Instead, use a regular function
def square(x):
    print(x)
    return x**2

3. Quand devrais-je utiliser une fonction lambda en Python ?

Vous devriez utiliser une fonction lambda lorsque vous avez besoin d'une petite fonction à usage unique. Cela est particulièrement utile dans les situations où une définition complète de fonction n'est pas nécessaire, comme :

  • Comme argument d'une fonction d'ordre supérieur (une fonction qui prend une autre fonction en argument)
  • Comme valeur de retour d'une autre fonction
  • Dans le traitement des données, comme le tri ou le filtrage

Exemple :

# Using a lambda function as an argument to the sorted function
numbers = [1, 4, 2, 3]
sorted_numbers = sorted(numbers, key=lambda x: x**2)
print(sorted_numbers)  # [1, 2, 3, 4]

4. Quelle est la différence entre lambda et def en Python ?

La principale différence entre lambda et def réside dans la manière dont ils définissent les fonctions. def est utilisé pour définir une fonction nommée, tandis que lambda est utilisé pour définir une fonction anonyme. Les fonctions lambda sont limitées à une seule expression, alors que les fonctions def peuvent comporter plusieurs lignes de code.

Exemple :

# Defining a named function with def
def square(x):
    return x**2

# Defining an anonymous function with lambda
lambda_square = lambda x: x**2

5. Une expression lambda peut-elle être utilisée comme décorateur ?

Oui, une expression lambda peut être utilisée comme un décorateur. Cependant, ce n'est pas une pratique courante en raison de préoccupations liées à la lisibilité et à la maintenabilité. Les décorateurs sont généralement utilisés pour modifier le comportement des fonctions, et les fonctions lambda ne sont pas bien adaptées pour une logique complexe.

Exemple :

# Using a lambda function as a decorator
def lambda_decorator(func):
    return lambda *args, **kwargs: func(*args, **kwargs)

@lambda_decorator
def example_function():
    print("This function has been decorated with a lambda.")

6. Une expression lambda peut-elle être utilisée comme générateur ?

Non, une expression lambda ne peut pas être utilisée comme un générateur. Les générateurs sont un type d'itérable, et les fonctions lambda ne sont pas conçues pour produire une séquence de valeurs. Si vous avez besoin d'un générateur, vous devriez utiliser une fonction génératrice ou une expression génératrice.

Exemple :

# This is not allowed
lambda x: (x**2 for x in range(10))

# Instead, use a generator function
def square_generator():
    for x in range(10):
        yield x**2

Conclusion

Les expressions lambda en Python sont un outil puissant pour écrire des fonctions concises en une seule ligne. Elles sont particulièrement utiles lorsque vous devez passer une fonction comme argument à une autre fonction, telle que map, filter ou sorted.

Les fonctions lambda sont un outil, et comme tout outil, elles doivent être utilisées judicieusement. En comprenant quand utiliser et éviter les fonctions lambda, vous pouvez écrire un code plus efficace, lisible et facile à maintenir.

Lectures complémentaires

  • Tutoriel Python : Ce tutoriel offre une introduction complète à la programmation en Python, couvrant les bases du langage, les types de données, le contrôle de flux, les fonctions et bien plus encore. C'est une excellente ressource pour les débutants afin d'apprendre les fondamentaux de Python.
  • Comment utiliser la fonction map en Python : Ce tutoriel fournit un guide complet sur l'utilisation de la fonction map en Python, incluant des exemples et des bonnes pratiques. Il aidera les lecteurs à comprendre comment appliquer une fonction à chaque élément d'un itérable et transformer les résultats en un nouvel itérable.
  • Moyenne d'une liste en Python : Ce tutoriel explique comment calculer la moyenne d'une liste de nombres en Python. Il couvre différentes approches, y compris l'utilisation de la fonction sum et de la fonction len, ainsi que l'utilisation du module statistics. Les lecteurs apprendront comment calculer efficacement la moyenne d'une liste et gérer les cas particuliers.
  • Fonction Python map : Ce tutoriel approfondit la fonction map, en explorant sa syntaxe, son utilisation et ses applications courantes. Il aidera les lecteurs à comprendre comment utiliser map pour transformer des itérables, y compris des listes, des tuples et des ensembles, et comment enchaîner plusieurs opérations map ensemble.

Merci d'apprendre avec la communauté Linux-Console.net.