215 votes

Fonction lambda dans les compréhensions de liste

Pourquoi la sortie des deux compréhensions de liste suivantes est-elle différente, même si f et la fonction lambda sont identiques ?

 f = lambda x: x*x
[f(x) for x in range(10)]

et

 [lambda x: x*x for x in range(10)]

Remarquez que type(f) et type(lambda x: x*x) renvoient le même type.

353voto

Winston Ewert Points 17746

Le premier crée une seule fonction lambda et l'appelle dix fois.

Le second n'appelle pas la fonction. Il crée 10 fonctions lambda différentes. Il met tous ceux-ci dans une liste. Pour le rendre équivalent au premier, vous avez besoin de :

 [(lambda x: x*x)(x) for x in range(10)]

Ou mieux encore :

 [x*x for x in range(10)]

23voto

Gabe Points 49718

La grande différence est que le premier exemple invoque en fait le lambda f(x) , tandis que le deuxième exemple ne le fait pas.

Votre premier exemple est équivalent à [(lambda x: x*x)(x) for x in range(10)] tandis que votre deuxième exemple est équivalent à [f for x in range(10)] .

15voto

zellio Points 8863

Le premier

 f = lambda x: x*x
[f(x) for x in range(10)]

exécute f() pour chaque valeur de la plage, donc f(x) pour chaque valeur

le deuxième

 [lambda x: x*x for x in range(10)]

exécute le lambda pour chaque valeur de la liste, il génère donc toutes ces fonctions.

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