Fonctions anonymes et Lambda

PythonPythonBeginner
Pratiquer maintenant

This tutorial is from open-source community. Access the source code

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Les fonctions anonymes en Python sont appelées fonctions lambda. Elles sont un moyen de créer des fonctions sans nom. Elles sont utiles pour créer de courtes fonctions qui ne sont utilisées qu'une seule fois.

Tri de listes revisité

Les listes peuvent être triées in-place. En utilisant la méthode sort.

s = [10,1,7,3]
s.sort() ## s = [1,3,7,10]

Vous pouvez trier dans l'ordre inverse.

s = [10,1,7,3]
s.sort(reverse=True) ## s = [10,7,3,1]

Cela semble assez simple. Cependant, comment trier une liste de dictionnaires?

[{'name': 'AA', 'price': 32.2,'shares': 100},
{'name': 'IBM', 'price': 91.1,'shares': 50},
{'name': 'CAT', 'price': 83.44,'shares': 150},
{'name': 'MSFT', 'price': 51.23,'shares': 200},
{'name': 'GE', 'price': 40.37,'shares': 95},
{'name': 'MSFT', 'price': 65.1,'shares': 50},
{'name': 'IBM', 'price': 70.44,'shares': 100}]

Selon quel critère?

Vous pouvez guider le tri en utilisant une fonction clé. La fonction clé est une fonction qui reçoit le dictionnaire et renvoie la valeur d'intérêt pour le tri.

portfolio = [
    {'name': 'AA', 'price': 32.2,'shares': 100},
    {'name': 'IBM', 'price': 91.1,'shares': 50},
    {'name': 'CAT', 'price': 83.44,'shares': 150},
    {'name': 'MSFT', 'price': 51.23,'shares': 200},
    {'name': 'GE', 'price': 40.37,'shares': 95},
    {'name': 'MSFT', 'price': 65.1,'shares': 50},
    {'name': 'IBM', 'price': 70.44,'shares': 100}
]

def stock_name(s):
    return s['name']

portfolio.sort(key=stock_name)

Voici le résultat.

## Vérifiez comment les dictionnaires sont triés par la clé `name`
[
  {'name': 'AA', 'price': 32.2,'shares': 100},
  {'name': 'CAT', 'price': 83.44,'shares': 150},
  {'name': 'GE', 'price': 40.37,'shares': 95},
  {'name': 'IBM', 'price': 91.1,'shares': 50},
  {'name': 'IBM', 'price': 70.44,'shares': 100},
  {'name': 'MSFT', 'price': 51.23,'shares': 200},
  {'name': 'MSFT', 'price': 65.1,'shares': 50}
]

Fonctions de rappel

Dans l'exemple ci-dessus, la fonction clé est un exemple de fonction de rappel. La méthode sort() "rappelle" une fonction que vous fournissez. Les fonctions de rappel sont souvent de courtes fonctions sur une seule ligne qui ne sont utilisées que pour cette seule opération. Les programmeurs demandent souvent un raccourci pour spécifier ce traitement supplémentaire.

Lambda : Fonctions anonymes

Utilisez une fonction lambda au lieu de créer une fonction. Dans notre exemple de tri précédent.

portfolio.sort(key=lambda s: s['name'])

Cela crée une fonction sans nom qui évalue une seule expression. Le code ci-dessus est beaucoup plus court que le code initial.

def stock_name(s):
    return s['name']

portfolio.sort(key=stock_name)

## vs lambda
portfolio.sort(key=lambda s: s['name'])

Utilisation de lambda

  • lambda est fortement restreint.
  • Seule une seule expression est autorisée.
  • Aucune instruction comme if, while, etc.
  • L'utilisation la plus courante est avec des fonctions comme sort().

Lire des données de portefeuille d'actions et les convertir en une liste :

>>> import report
>>> portfolio = list(report.read_portfolio('portfolio.csv'))
>>> for s in portfolio:
        print(s)

Stock('AA', 100, 32.2)
Stock('IBM', 50, 91.1)
Stock('CAT', 150, 83.44)
Stock('MSFT', 200, 51.23)
Stock('GE', 95, 40.37)
Stock('MSFT', 50, 65.1)
Stock('IBM', 100, 70.44)
>>>

Exercice 7.5 : Tri sur un champ

Essayez les instructions suivantes qui trient les données du portefeuille par ordre alphabétique du nom de l'action.

>>> def stock_name(s):
       return s.name

>>> portfolio.sort(key=stock_name)
>>> for s in portfolio:
           print(s)

... inspectez le résultat...
>>>

Dans cette partie, la fonction stock_name() extrait le nom d'une action d'un seul élément de la liste portfolio. sort() utilise le résultat de cette fonction pour effectuer la comparaison.

Exercice 7.6 : Tri sur un champ avec lambda

Essayez de trier le portefeuille selon le nombre d'actions en utilisant une expression lambda :

>>> portfolio.sort(key=lambda s: s.shares)
>>> for s in portfolio:
        print(s)

... inspectez le résultat...
>>>

Essayez de trier le portefeuille selon le prix de chaque action

>>> portfolio.sort(key=lambda s: s.price)
>>> for s in portfolio:
        print(s)

... inspectez le résultat...
>>>

Note : lambda est un raccourci pratique car il vous permet de définir directement une fonction de traitement spéciale dans l'appel à sort() contrairement à devoir définir une fonction séparée en premier lieu.

Sommaire

Félicitations ! Vous avez terminé le laboratoire sur les fonctions anonymes et lambda. Vous pouvez pratiquer d'autres laboratoires sur LabEx pour améliorer vos compétences.