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.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Mises en situation
  5. 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: i affiche [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)).

    key reçoit chaque élément et rend la valeur sur laquelle comparer ; le signe moins inverse l'ordre. On peut aussi écrire reverse=True avec key=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=...), map et filter en 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 avec lambda: afficher(n). Tous affichent 2. Quelle correction est juste ?

    • Remplacer range(3) par range(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=n est évaluée à la création de chaque lambda et fige la valeur courante. Appeler afficher(n) tout de suite l'exécuterait au lieu de l'attendre au clic.