Comment créer des fonctions en ligne en Python

PythonBeginner
Pratiquer maintenant

Introduction

Dans le monde de la programmation Python, les fonctions en ligne offrent un moyen puissant et concis de créer de petites fonctions à une seule expression, sans avoir besoin d'une définition formelle de fonction. Ces fonctions en ligne, connues sous le nom de fonctions lambda en Python, sont particulièrement utiles pour les opérations simples et les techniques de programmation fonctionnelle. Ce tutoriel vous guidera à travers la création et l'utilisation des fonctions lambda pour écrire du code Python plus élégant et efficace.

Comprendre les bases des fonctions Lambda

Que sont les fonctions Lambda

En Python, les fonctions lambda sont de petites fonctions anonymes définies à l'aide du mot-clé lambda au lieu de l'instruction def standard. Elles sont appelées "anonymes" car elles ne nécessitent pas de nom comme les fonctions traditionnelles.

La syntaxe de base d'une fonction lambda est la suivante :

lambda arguments: expression

Les fonctions lambda sont limitées à une seule expression et renvoient automatiquement le résultat de cette expression.

Créer votre première fonction Lambda

Créons et testons quelques fonctions lambda simples :

  1. Ouvrez un nouveau fichier Python dans votre éditeur de code. Cliquez sur "File" > "New File" dans le WebIDE et enregistrez-le sous le nom lambda_basics.py dans le répertoire /home/labex/project.

  2. Ajoutez le code suivant pour créer votre première fonction lambda :

## Une fonction lambda simple qui met un nombre au carré
square = lambda x: x * x

## Test de la fonction lambda
result = square(5)
print(f"Le carré de 5 est : {result}")
  1. Exécutez votre code en ouvrant un terminal (s'il n'est pas déjà ouvert) et en exécutant :
python3 ~/project/lambda_basics.py

Vous devriez voir la sortie :

Le carré de 5 est : 25

Fonctions Lambda vs. Fonctions régulières

Comparons les fonctions lambda avec leurs fonctions régulières équivalentes :

  1. Ajoutez le code suivant à votre fichier lambda_basics.py :
## Fonction régulière qui additionne deux nombres
def add_regular(a, b):
    return a + b

## Fonction lambda équivalente
add_lambda = lambda a, b: a + b

## Test des deux fonctions
print(f"Fonction régulière : 3 + 5 = {add_regular(3, 5)}")
print(f"Fonction lambda : 3 + 5 = {add_lambda(3, 5)}")
  1. Exécutez à nouveau votre code :
python3 ~/project/lambda_basics.py

Vous devriez maintenant voir :

Le carré de 5 est : 25
Fonction régulière : 3 + 5 = 8
Fonction lambda : 3 + 5 = 8

Quand utiliser les fonctions Lambda

Les fonctions lambda sont les plus utiles lorsque :

  • Vous avez besoin d'une fonction simple pour une courte période
  • La logique de la fonction peut être exprimée en une seule ligne
  • Vous souhaitez passer une fonction en tant qu'argument à une autre fonction

Créons un autre exemple avec plusieurs paramètres :

  1. Ajoutez le code suivant à votre fichier lambda_basics.py :
## Fonction lambda avec plusieurs paramètres
calculate = lambda x, y, z: x * y + z

## Test avec différentes valeurs
result1 = calculate(2, 3, 4)
result2 = calculate(5, 2, 1)

print(f"2 * 3 + 4 = {result1}")
print(f"5 * 2 + 1 = {result2}")
  1. Exécutez votre code mis à jour :
python3 ~/project/lambda_basics.py

Vous devriez voir une sortie supplémentaire :

2 * 3 + 4 = 10
5 * 2 + 1 = 11

Résumé des bases des fonctions Lambda

Les fonctions lambda sont idéales pour créer des fonctions simples d'une seule ligne. Elles offrent un moyen concis d'écrire du code lorsque vous n'avez pas besoin d'une définition de fonction complète. Dans l'étape suivante, nous explorerons comment utiliser les fonctions lambda avec les fonctions intégrées de Python pour des opérations plus puissantes.

Utilisation de Lambda avec les fonctions intégrées

Les fonctions lambda deviennent particulièrement puissantes lorsqu'elles sont combinées avec les fonctions intégrées de Python telles que map(), filter() et sorted(). Ces combinaisons vous permettent d'écrire du code efficace pour la transformation et la manipulation des données.

La fonction map() avec Lambda

La fonction map() applique une fonction donnée à chaque élément d'un itérable (comme une liste) et renvoie un objet map avec les résultats.

  1. Créez un nouveau fichier nommé lambda_builtin.py dans le répertoire /home/labex/project.

  2. Ajoutez le code suivant pour démontrer l'utilisation de map() avec lambda :

## Utilisation de map() avec une fonction lambda pour mettre au carré chaque nombre d'une liste
numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x**2, numbers))

print("Nombres originaux:", numbers)
print("Nombres au carré:", squared_numbers)
  1. Exécutez votre code :
python3 ~/project/lambda_builtin.py

Vous devriez voir :

Nombres originaux: [1, 2, 3, 4, 5]
Nombres au carré: [1, 4, 9, 16, 25]

La fonction filter() avec Lambda

La fonction filter() crée un nouvel itérable avec des éléments qui satisfont une condition (la fonction renvoie True).

  1. Ajoutez le code suivant à votre fichier lambda_builtin.py :
## Utilisation de filter() avec une fonction lambda pour trouver les nombres pairs
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))

print("Tous les nombres:", numbers)
print("Nombres pairs:", even_numbers)

## Utilisation de filter() pour trouver les noms qui commencent par 'J'
names = ["Alice", "Bob", "John", "Jane", "Michael", "Jessica"]
j_names = list(filter(lambda name: name.startswith('J'), names))

print("Tous les noms:", names)
print("Noms commençant par J:", j_names)
  1. Exécutez votre code mis à jour :
python3 ~/project/lambda_builtin.py

Vous devriez voir une sortie supplémentaire :

Tous les nombres: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Nombres pairs: [2, 4, 6, 8, 10]
Tous les noms: ['Alice', 'Bob', 'John', 'Jane', 'Michael', 'Jessica']
Noms commençant par J: ['John', 'Jane', 'Jessica']

La fonction sorted() avec Lambda

La fonction sorted() vous permet de trier des itérables en utilisant une fonction clé personnalisée, ce qui est là où les fonctions lambda sont très utiles.

  1. Ajoutez le code suivant à votre fichier lambda_builtin.py :
## Utilisation de sorted() avec lambda pour trier par le deuxième élément des tuples
pairs = [(1, 5), (3, 2), (5, 7), (2, 9), (4, 1)]
sorted_by_second = sorted(pairs, key=lambda pair: pair[1])

print("Paires originales:", pairs)
print("Triées par deuxième élément:", sorted_by_second)

## Utilisation de sorted() avec lambda pour trier les chaînes par longueur
words = ["apple", "banana", "cherry", "date", "elderberry", "fig"]
sorted_by_length = sorted(words, key=lambda word: len(word))

print("Mots originaux:", words)
print("Triés par longueur:", sorted_by_length)
  1. Exécutez votre code mis à jour :
python3 ~/project/lambda_builtin.py

Vous devriez voir une sortie supplémentaire :

Paires originales: [(1, 5), (3, 2), (5, 7), (2, 9), (4, 1)]
Triées par deuxième élément: [(4, 1), (3, 2), (1, 5), (5, 7), (2, 9)]
Mots originaux: ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig']
Triés par longueur: ['fig', 'date', 'apple', 'cherry', 'banana', 'elderberry']

Combiner plusieurs fonctions Lambda

Vous pouvez également enchaîner ou combiner plusieurs opérations en utilisant des fonctions lambda :

  1. Ajoutez le code suivant à votre fichier lambda_builtin.py :
## Combiner map et filter avec des fonctions lambda
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

## D'abord mettre les nombres au carré, puis filtrer pour les valeurs supérieures à 20
result = list(filter(lambda x: x > 20, map(lambda x: x**2, numbers)))

print("Nombres originaux:", numbers)
print("Nombres au carré > 20:", result)
  1. Exécutez votre code mis à jour :
python3 ~/project/lambda_builtin.py

Vous devriez voir une sortie supplémentaire :

Nombres originaux: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Nombres au carré > 20: [25, 36, 49, 64, 81, 100]

Les fonctions lambda avec les fonctions intégrées telles que map(), filter() et sorted() offrent un moyen puissant de traiter les données avec un code minimal. Dans l'étape suivante, nous explorerons des applications plus pratiques des fonctions lambda.

Applications Pratiques des Fonctions Lambda

Dans cette étape, nous explorerons quelques applications pratiques des fonctions lambda, y compris leur utilisation avec la logique conditionnelle et comment les utiliser dans des scénarios réels.

Fonctions Lambda avec Expressions Conditionnelles

Les fonctions lambda peuvent inclure des expressions conditionnelles en utilisant la syntaxe de l'opérateur ternaire de Python : x if condition else y.

  1. Créez un nouveau fichier nommé lambda_practical.py dans le répertoire /home/labex/project.

  2. Ajoutez le code suivant pour démontrer les fonctions lambda conditionnelles :

## Fonction lambda avec expression conditionnelle
get_status = lambda score: "Pass" if score >= 60 else "Fail"

## Tester la fonction avec différentes notes
scores = [45, 90, 60, 30, 75]

for score in scores:
    status = get_status(score)
    print(f"Note : {score}, Statut : {status}")
  1. Exécutez votre code :
python3 ~/project/lambda_practical.py

Vous devriez voir :

Note : 45, Statut : Fail
Note : 90, Statut : Pass
Note : 60, Statut : Pass
Note : 30, Statut : Fail
Note : 75, Statut : Pass

Création d'une Calculatrice Simple avec des Fonctions Lambda

Les fonctions lambda sont parfaites pour créer des fonctions utilitaires simples comme une calculatrice :

  1. Ajoutez le code suivant à votre fichier lambda_practical.py :
## Création d'une calculatrice utilisant des fonctions lambda
operations = {
    'add': lambda x, y: x + y,
    'subtract': lambda x, y: x - y,
    'multiply': lambda x, y: x * y,
    'divide': lambda x, y: x / y if y != 0 else "Division par zéro impossible"
}

## Tester la calculatrice
a, b = 10, 2

for operation, func in operations.items():
    result = func(a, b)
    print(f"{a} {operation} {b} = {result}")

## Tester la division par zéro
print(f"10 divide 0 = {operations['divide'](10, 0)}")
  1. Exécutez votre code :
python3 ~/project/lambda_practical.py

Vous devriez voir une sortie supplémentaire :

10 add 2 = 12
10 subtract 2 = 8
10 multiply 2 = 20
10 divide 2 = 5.0
10 divide 0 = Division par zéro impossible

Transformation de Données avec des Fonctions Lambda

Les fonctions lambda sont excellentes pour transformer des structures de données :

  1. Ajoutez le code suivant à votre fichier lambda_practical.py :
## Traitement d'une liste de dictionnaires avec des fonctions lambda
employees = [
    {'name': 'Alice', 'salary': 90000, 'department': 'Engineering'},
    {'name': 'Bob', 'salary': 75000, 'department': 'Marketing'},
    {'name': 'Charlie', 'salary': 60000, 'department': 'Engineering'},
    {'name': 'David', 'salary': 85000, 'department': 'HR'},
    {'name': 'Eve', 'salary': 120000, 'department': 'Engineering'}
]

## Trouver les employés du département Engineering et les trier par salaire (du plus élevé au plus bas)
engineering_employees = sorted(
    filter(lambda emp: emp['department'] == 'Engineering', employees),
    key=lambda emp: emp['salary'],
    reverse=True
)

print("Employés du département Engineering (salaire du plus élevé au plus bas) :")
for employee in engineering_employees:
    print(f"  {employee['name']} : ${employee['salary']}")

## Calculer le salaire moyen
average_salary = sum(map(lambda emp: emp['salary'], employees)) / len(employees)
print(f"\nSalaire moyen : ${average_salary:.2f}")

## Trouver les employés ayant un salaire supérieur à la moyenne
above_average = list(filter(lambda emp: emp['salary'] > average_salary, employees))
print(f"\nEmployés ayant un salaire supérieur à la moyenne :")
for employee in above_average:
    print(f"  {employee['name']} : ${employee['salary']} ({employee['department']})")
  1. Exécutez votre code mis à jour :
python3 ~/project/lambda_practical.py

Vous devriez voir une sortie supplémentaire :

Employés du département Engineering (salaire du plus élevé au plus bas) :
  Eve : $120000
  Alice : $90000
  Charlie : $60000

Salaire moyen : $86000.00

Employés ayant un salaire supérieur à la moyenne :
  Alice : $90000 (Engineering)
  Eve : $120000 (Engineering)

Fonctions Lambda comme Gestionnaires d'Événements avec Tkinter

Les fonctions lambda sont couramment utilisées comme gestionnaires d'événements dans les applications GUI. Créons une application Tkinter simple pour démontrer cela :

  1. Ajoutez le code suivant dans un nouveau fichier nommé lambda_gui.py dans le répertoire /home/labex/project :
sudo apt update
sudo apt install python3-tk -y
import tkinter as tk

## Créer une calculatrice GUI simple
def create_calculator():
    ## Créer la fenêtre principale
    window = tk.Tk()
    window.title("Calculatrice Lambda")
    window.geometry("300x200")

    ## Créer les champs d'entrée
    ## ... (code identique)

(Le reste du code est identique)

Techniques avancées avec Lambda

Dans cette dernière étape, nous allons explorer quelques techniques avancées utilisant les fonctions lambda, y compris les lambdas imbriquées, les fermetures (closures) et les fonctions d'ordre supérieur.

Retourner des fonctions Lambda depuis des fonctions

Les fonctions lambda peuvent être créées et retournées depuis d'autres fonctions, ce qui permet la création dynamique de fonctions :

  1. Créez un nouveau fichier nommé lambda_advanced.py dans le répertoire /home/labex/project.

  2. Ajoutez le code suivant :

## Fonction qui retourne une fonction lambda
def create_multiplier(factor):
    """Retourne une fonction qui multiplie son entrée par le facteur donné."""
    return lambda x: x * factor

## Créer des fonctions de multiplication spécifiques
double = create_multiplier(2)
triple = create_multiplier(3)
quadruple = create_multiplier(4)

## Tester les fonctions de multiplication
number = 10
print(f"Nombre original: {number}")
print(f"Double: {double(number)}")
print(f"Triple: {triple(number)}")
print(f"Quadruple: {quadruple(number)}")
  1. Exécutez votre code :
python3 ~/project/lambda_advanced.py

Vous devriez voir :

Nombre original: 10
Double: 20
Triple: 30
Quadruple: 40

Composition de fonctions avec Lambda

Nous pouvons composer des fonctions en utilisant lambda pour créer un pipeline d'opérations :

  1. Ajoutez le code suivant à votre fichier lambda_advanced.py :
## Composition de fonctions en utilisant lambda
def compose(f, g):
    """Retourne une fonction qui applique f après g."""
    return lambda x: f(g(x))

## Créer des fonctions composantes
square = lambda x: x * x
increment = lambda x: x + 1
decrement = lambda x: x - 1

## Créer des fonctions composites
square_then_increment = compose(increment, square)
increment_then_square = compose(square, increment)
complex_operation = compose(square, compose(increment, square))

## Tester les fonctions composites
value = 5
print(f"\nValeur originale: {value}")
print(f"square_then_increment: {square_then_increment(value)}")  ## (5² = 25) + 1 = 26
print(f"increment_then_square: {increment_then_square(value)}")  ## (5 + 1)² = 36
print(f"complex_operation: {complex_operation(value)}")          ## ((5² = 25) + 1)² = 676
  1. Exécutez votre code mis à jour :
python3 ~/project/lambda_advanced.py

Vous devriez voir une sortie supplémentaire :

Valeur originale: 5
square_then_increment: 26
increment_then_square: 36
complex_operation: 676

Fonctions Lambda récursives

Créer de véritables fonctions lambda récursives est difficile en Python en raison de la façon dont les lambdas sont définies. Cependant, nous pouvons utiliser une astuce avec le Y combinator pour créer des fonctions lambda récursives :

  1. Ajoutez le code suivant à votre fichier lambda_advanced.py :
## Y combinator pour créer des fonctions lambda récursives
Y = lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))

## Création d'une fonction factorielle récursive en utilisant lambda et le Y combinator
factorial = Y(lambda f: lambda n: 1 if n <= 0 else n * f(n - 1))

## Tester la fonction factorielle récursive
for i in range(6):
    print(f"factorielle({i}) = {factorial(i)}")

## Création d'une fonction Fibonacci récursive en utilisant lambda et le Y combinator
fibonacci = Y(lambda f: lambda n: n if n <= 1 else f(n-1) + f(n-2))

## Tester la fonction Fibonacci récursive
print("\nSuite de Fibonacci:")
for i in range(10):
    print(f"fibonacci({i}) = {fibonacci(i)}")
  1. Exécutez votre code mis à jour :
python3 ~/project/lambda_advanced.py

Vous devriez voir une sortie supplémentaire :

factorielle(0) = 1
factorielle(1) = 1
factorielle(2) = 2
factorielle(3) = 6
factorielle(4) = 24
factorielle(5) = 120

Suite de Fibonacci:
fibonacci(0) = 0
fibonacci(1) = 1
fibonacci(2) = 1
fibonacci(3) = 2
fibonacci(4) = 3
fibonacci(5) = 5
fibonacci(6) = 8
fibonacci(7) = 13
fibonacci(8) = 21
fibonacci(9) = 34

Lambda avec l'application partielle de fonction

L'application partielle de fonction vous permet de créer de nouvelles fonctions en pré-remplissant certains arguments de fonctions existantes :

  1. Ajoutez le code suivant à votre fichier lambda_advanced.py :
from functools import partial

## Fonction originale avec plusieurs paramètres
def power(base, exponent):
    return base ** exponent

## Création de fonctions spécialisées en utilisant partial et lambda
square = partial(power, exponent=2)
cube = partial(power, exponent=3)

## Approche alternative en utilisant lambda
square_lambda = lambda x: power(x, 2)
cube_lambda = lambda x: power(x, 3)

## Tester les deux approches
number = 4
print(f"\nNombre original: {number}")
print(f"carré (partial): {square(number)}")
print(f"cube (partial): {cube(number)}")
print(f"carré (lambda): {square_lambda(number)}")
print(f"cube (lambda): {cube_lambda(number)}")

## Application partielle avec plusieurs arguments pré-remplis
def format_string(prefix, content, suffix):
    return f"{prefix}{content}{suffix}"

## Créer des formateurs spécialisés
html_paragraph = partial(format_string, "<p>", suffix="</p>")
html_div = partial(format_string, "<div>", suffix="</div>")

## Tester les formateurs spécialisés
content = "Bonjour, le monde !"
print(f"\nContenu original: {content}")
print(f"Paragraphe HTML: {html_paragraph(content)}")
print(f"Div HTML: {html_div(content)}")
  1. Exécutez votre code mis à jour :
python3 ~/project/lambda_advanced.py

Vous devriez voir une sortie supplémentaire :

Nombre original: 4
carré (partial): 16
cube (partial): 64
carré (lambda): 16
cube (lambda): 64

Contenu original: Bonjour, le monde !
Paragraphe HTML: <p>Bonjour, le monde !</p>
Div HTML: <div>Bonjour, le monde !</div>

Ces techniques avancées mettent en évidence la flexibilité et la puissance des fonctions lambda en Python. En combinant les fonctions lambda avec les fonctions d'ordre supérieur, la composition fonctionnelle et l'application partielle, vous pouvez créer des solutions concises et élégantes à des problèmes complexes.

Résumé

Dans ce lab, vous avez appris à créer et à utiliser des fonctions en ligne (fonctions lambda) en Python, en progressant des concepts de base aux techniques avancées.

Voici ce que vous avez accompli :

  1. Fonctions Lambda de base - Vous avez appris la syntaxe et l'utilisation de base des fonctions lambda, les avez comparées aux fonctions régulières et avez compris quand les utiliser.

  2. Lambda avec les fonctions intégrées - Vous avez exploré comment combiner les fonctions lambda avec les fonctions intégrées de Python comme map(), filter() et sorted() pour effectuer des transformations de données puissantes de manière efficace.

  3. Applications pratiques de Lambda - Vous avez mis en œuvre des exemples pratiques, notamment des expressions conditionnelles, une calculatrice simple et des techniques de transformation de données pour traiter des collections de données.

  4. Techniques avancées avec Lambda - Vous avez exploré les fonctions d'ordre supérieur, la composition de fonctions, les fonctions lambda récursives en utilisant le Y combinator et l'application partielle de fonction pour résoudre des problèmes complexes de manière concise.

Les fonctions lambda sont un outil puissant en programmation Python, permettant des styles de programmation fonctionnels et concis. Bien qu'elles soient les plus adaptées aux opérations simples, leur capacité à être passées comme arguments et à être retournées par des fonctions les rend incroyablement polyvalentes pour un large éventail d'applications.

En maîtrisant les fonctions lambda, vous avez ajouté un outil important à votre boîte à outils de programmation Python qui vous aidera à écrire du code plus élégant et efficace.