93 votes

Pourquoi utiliser les fonctions lambda ?

Je peux trouver beaucoup de choses qui me montrent ce qu'est une fonction lambda, comment fonctionne la syntaxe et tout le reste. Mais à part le facteur "cool" (je peux faire d'une fonction au milieu un appel à une autre fonction, chouette !), je n'ai pas vu quelque chose d'absolument convaincant qui me permette de dire pourquoi j'ai vraiment besoin ou envie de les utiliser.

Il semble que ce soit plutôt un choix stylistique ou structurel dans la plupart des exemples que j'ai vus. Et casse un peu la règle du "Une seule façon correcte de faire quelque chose" en python. Comment cela rend-il mes programmes plus corrects, plus fiables, plus rapides ou plus faciles à comprendre ? (La plupart des normes de codage que j'ai vues ont tendance à vous dire d'éviter les déclarations trop complexes sur une seule ligne. Si cela rend la lecture plus facile, séparez-les).

0 votes

N'est-ce pas simplement l'équivalent en programmation fonctionnelle de ce que sont les interfaces ou les signatures de fonctions/méthodes dans les langages de programmation impératifs ? (-> Utilisé pour spécifier des callbacks et permettant ainsi de créer des applications/composants logiciels faiblement couplés).

0 votes

Les lambdas sont des "littéraux de fonction". Elles sont utiles et pratiques pour la même raison que les littéraux de liste et de carte (par opposition à l'utilisation manuelle de la fonction append etc). Si vous autorisez l'un dans certaines circonstances, il n'y a aucune raison logique de s'opposer à l'autre dans toutes les circonstances.

2 votes

Duplicata possible : Python Lambda - pourquoi ?

34voto

JAB Points 11053

Voici un bon exemple :

def key(x):
    return x[1]

a = [(1, 2), (3, 1), (5, 10), (11, -3)]
a.sort(key=key)

contre

a = [(1, 2), (3, 1), (5, 10), (11, -3)]
a.sort(key=lambda x: x[1])

Sous un autre angle : Les expressions lambda sont également connues sous le nom de "fonctions anonymes" et sont très utiles dans certains paradigmes de programmation, notamment la programmation fonctionnelle, dont le lambda calculus s'est inspiré.

http://en.wikipedia.org/wiki/Lambda_calculus

8 votes

Sans rapport : vous pourriez utiliser operator.itemgetter(1) au lieu de lambda x: x[1] .

0 votes

Sort() a supporté key depuis 2.4

1 votes

@J.F. Sebastian : Bien que cela vous obligerait à import operator d'abord. @Amber : Merci ; je n'arrivais pas à me souvenir de ce que j'avais en tête, alors j'ai pris des précautions.

21voto

Donald Miner Points 18116

La syntaxe est plus concise dans certaines situations, principalement lorsqu'il s'agit de map et al.

map(lambda x: x * 2, [1,2,3,4])

me semble meilleur que :

def double(x):
    return x * 2

map(double, [1,2,3,4])

Je pense que le lambda est un meilleur choix dans cette situation car le def double semble presque déconnecté de la map qui l'utilise. De plus, je suppose que cela présente l'avantage supplémentaire que la fonction est jetée lorsque vous avez terminé.

Il y a un inconvénient à lambda qui limite son utilité en Python, à mon avis : les lambdas ne peuvent avoir qu'une seule expression (c'est-à-dire que vous ne pouvez pas avoir plusieurs lignes). Cela ne peut tout simplement pas fonctionner dans un langage qui force les espaces blancs.

De plus, à chaque fois que j'utilise lambda, je me sens bien.

12 votes

La compréhension de la liste pourrait être plus appropriée dans ce cas. [x*2 for x in [1,2,3,4]] .

2 votes

Je ne connais pas python (bien que ce soit définitivement en haut de ma liste de choses à apprendre), alors je me demande... y a-t-il vraiment une bonne raison pour que plusieurs lignes ne soient pas autorisées pour une expression lambda ? Pourquoi le corps de l'expression lambda ne peut-il pas être placé un onglet plus à droite ou quelque chose comme ça ?

1 votes

@incrediman : si vous écrivez plusieurs lignes de lambda, l'idée est que vous feriez mieux d'utiliser une fonction 'correcte'.

18voto

David Points 65209

Pour moi, c'est une question d'expressivité du code. Lorsque l'on écrit du code que les gens devront supporter, ce code doit raconter une histoire de la manière la plus concise et la plus facile à comprendre possible. Parfois, l'expression lambda est plus compliquée, d'autres fois, elle indique plus directement ce que fait cette ligne ou ce bloc de code. Faites preuve de discernement lorsque vous écrivez.

Pensez-y comme à la structuration d'une phrase. Quelles sont les parties importantes (noms et verbes vs. objets et méthodes, etc.) et comment doivent-elles être ordonnées pour que cette ligne ou ce bloc de code transmette intuitivement ce qu'il fait.

6 votes

C'est merveilleux : "Le code doit raconter une histoire de manière aussi concise et facile à comprendre que possible... Pensez-y comme à la structuration d'une phrase...". -- Je vais l'utiliser dans le prochain cours que je donne, si cela ne vous dérange pas !

0 votes

C'est la meilleure réponse. Parfois lambda est juste et parfois non, mais la raison est la lisibilité et le support.

13voto

Wayne Werner Points 10172

Les fonctions lambda sont surtout utiles dans des cas comme les fonctions de rappel, ou dans les cas où vous avez besoin d'une fonction à jeter. L'exemple de JAB est parfait - Il serait mieux accompagné de l'argument du mot clé key mais elle fournit néanmoins des informations utiles.

Lorsque

def key(x):
    return x[1]

apparaît à 300 lignes de

[(1,2), (3,1), (5,10), (11,-3)].sort(key)

Que fait la clé ? Il n'y a pas vraiment d'indication. Vous pouvez avoir une idée, surtout si vous êtes familier avec la fonction, mais en général, cela nécessite de revenir en arrière pour regarder. PAR CONTRE,

[(1,2), (3,1), (5,10), (11,-3)].sort(lambda x: x[1])

vous en dit beaucoup plus.

  1. Sort prend une fonction comme argument
  2. Cette fonction prend un paramètre (et "renvoie" un résultat).
  3. J'essaie de trier cette liste par la deuxième valeur de chacun des éléments de la liste.
  4. (Si la liste était une variable et que vous ne pouviez pas voir les valeurs), cette logique s'attend à ce que la liste contienne au moins 2 éléments.

Il y a probablement d'autres informations, mais c'est déjà une quantité énorme que vous obtenez juste en utilisant une fonction lambda anonyme au lieu d'une fonction nommée.

De plus, il ne pollue pas votre espace de noms ;)

0 votes

Mon exemple initial n'était pas tout à fait parfait, car en Python 3, vous devez utiliser la clé comme argument de mot-clé (ce qui entraîne une erreur de type (TypeError) si vous laissez l'argument de mot-clé dans la clé). key= out). J'ai également oublié que sort qui effectue un tri in-place, ne renvoie pas réellement l'objet qu'il trie, vous devez donc l'utiliser sur une séquence mutable qui a déjà été assignée à une variable.

0 votes

Erreur, vous ne pouvez pas passer directement une fonction pour trier comme ceci, vous devez utiliser comme sort(key=key) ou sort(key=lambda function)

0 votes

Ce code est cassé à la fois dans python 2 (le premier argument est cmp pas key ) et dans python 3 (où sort n'accepte aucun argument positionnel). Dans les deux cas, vous devez utiliser ...sort(key=...) à la place.

10voto

Piotr Kalinowski Points 1672

Oui, vous avez raison, c'est un choix structurel. Le simple fait d'utiliser des expressions lambda ne rend probablement pas vos programmes plus corrects. Cela ne les rend pas non plus plus plus fiables, et cela n'a rien à voir avec la vitesse.

Il ne s'agit que de flexibilité et de pouvoir d'expression. Comme la compréhension d'une liste. Vous pouvez faire la plupart de ces choses en définissant des fonctions nommées (en polluant éventuellement l'espace de noms, mais c'est encore une fois une question purement stylistique).

Elle peut faciliter la lisibilité en évitant de définir une fonction nommée distincte, que quelqu'un d'autre devra trouver, lire et comprendre que tout ce qu'elle fait est d'appeler une méthode blah() sur son argument.

Il peut être beaucoup plus intéressant lorsque vous l'utilisez pour écrire des fonctions qui créent et renvoient d'autres fonctions, où ce que font exactement ces fonctions dépend de leurs arguments. Cela peut être un moyen très concis et lisible de paramétrer le comportement de votre code. Vous pouvez simplement exprimer des idées plus intéressantes.

Mais cela reste un choix structurel. Vous pouvez le faire autrement. Mais il en va de même pour la programmation orientée objet ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X