Lambdas et clôtures
La fonction comme valeur : fonction anonyme, fonction passée en argument, fonction qui en rend une, clôture, variables capturées et piège de la capture tardive dans une boucle.
- 18 cartes
- 5 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Mises en situation
- Comprendre
Quelques cartes du deck
Fonction anonyme (lambda) : de quoi s'agit-il ?
Voir la réponse
Fonction définie par une simple expression, sans lui donner de nom, là où l'on en a besoin :
lambda x: x * 2.En Python, le corps d'une lambda est une unique expression dont la valeur est rendue : pas d'instruction, pas de
return. Dès que la logique grossit, une fonction nommée est plus lisible.Qu'affiche ce programme ?
```python
fs = [lambda: i for i in range(3)]
print([f() for f in fs])`[2, 2, 2][0, 1, 2][3, 3, 3][0, 0, 0]
Voir la réponse
[2, 2, 2]Les trois lambdas partagent la même variable
i, lue à l'appel : la boucle l'a laissée à 2. Pour figer chaque valeur :lambda i=i: iaffiche[0, 1, 2].Pour trier des mots du plus long au plus court, on écrit sorted(mots, key=lambda m: …).
Voir la réponse
Pour trier des mots du plus long au plus court, on écrit sorted(mots, key=lambda m: -len(m)).
keyreçoit chaque élément et rend la valeur sur laquelle comparer ; le signe moins inverse l'ordre. On peut aussi écrirereverse=Trueaveckey=len.Fonction d'ordre supérieur : de quoi s'agit-il ?
Voir la réponse
Fonction qui prend une autre fonction en argument, ou qui en renvoie une.
sorted(liste, key=...),mapetfilteren sont des exemples : la fonction passée décrit ce qui varie, la fonction reçue gère la boucle.Trois boutons sont créés dans une boucle
for n in range(3), chacun aveclambda: afficher(n). Tous affichent 2. Quelle correction est juste ?- Remplacer
range(3)parrange(1, 4) - Lier la valeur à la création :
lambda n=n: afficher(n) - Appeler
afficher(n)à la création au lieu de le mettre dans la lambda - Remplacer la lambda par une compréhension de liste
Voir la réponse
Lier la valeur à la création :
lambda n=n: afficher(n)La valeur par défaut
n=nest évaluée à la création de chaque lambda et fige la valeur courante. Appelerafficher(n)tout de suite l'exécuterait au lieu de l'attendre au clic.- Remplacer