2012-12-10 4 views
-1
g = lambda x:[lambda x:x*1, lambda x:x*x, lambda x:x*x*x, lambda x:42][x%4](x) 

[g(x) for x in xrange(12)] 

Quelle est la prochaine valeur de cette séquence?Python lambda dans lambda

+2

Qu'avez-vous essayé? – glglgl

+1

La ligne '[x% 4] (x)' renvoie une erreur. Qu'essayez-vous de faire dans cette ligne? –

+0

Est-ce un devoir ou une question d'examen? –

Répondre

6

L'avez-vous essayé?

>>> g = lambda x:[lambda x:x*1, lambda x:x*x, lambda x:x*x*x, lambda x:42][x%4](x) 
>>> [g(x) for x in xrange(12)] 
[0, 1, 8, 42, 4, 25, 216, 42, 8, 81, 1000, 42] 

Voici comment chaque valeur est calculée:

[ 
0,  # x is 0, x%4 is 0, so g(x) becomes (lambda x:x*1)(0) or 0*1 
1,  # x is 1, x%4 is 1, so g(x) becomes (lambda x:x*x)(1) or 1*1 
8,  # x is 2, x%4 is 2, so g(x) becomes (lambda x:x*x*x)(2) or 2*2*2 
42, # x is 3, x%4 is 3, so g(x) becomes (lambda x:42)(3) or 42 
4,  # x is 4, x%4 is 0, so g(x) becomes (lambda x:x*1)(4) or 4*1 
25, # x is 5, x%4 is 1, so g(x) becomes (lambda x:x*x)(5) or 5*5 
216, # x is 6, x%4 is 2, so g(x) becomes (lambda x:x*x*x)(6) or 6*6*6 
42, # x is 7, x%4 is 3, so g(x) becomes (lambda x:42)(7) or 42 
8,  # x is 8, x%4 is 0, so g(x) becomes (lambda x:x*1)(8) or 8*1 
81, # x is 9, x%4 is 1, so g(x) becomes (lambda x:x*x)(9) or 9*9 
1000, # x is 10, x%4 is 2, so g(x) becomes (lambda x:x*x*x)(10) or 10*10*10 
42  # x is 11, x%4 is 3, so g(x) becomes (lambda x:42)(11) or 42 
] 

Fondamentalement g(x) appelle une des fonctions de la liste avec x comme argument, lorsqu'il est appelé dans une compréhension de liste avec xrange il fera défiler les fonctions, chaque quatrième appel ayant la même fonction.

Je sais que c'est juste un exercice pour aider à comprendre Python, mais vous devriez noter que c'est un code horriblement inefficace, puisque les quatre fonctions sont recréées à chaque appel à g(). Si vous aviez vraiment besoin de ce comportement, il serait préférable de créer simplement une fonction avec def qui contient plusieurs instructions if (ce qui rendrait le code beaucoup plus lisible).

+0

C'est un examen de devoirs du groupe Meetup Learn Python ici à Austin au Texas. C'est une réponse très utile. L'instructeur l'a décrit comme un exercice passif et agressif, et j'ai été perplexe en essayant d'y répondre. – user1893012

0

Je ferais cela pour avoir une meilleure idée de ce qui se passe (laisser un commentaire si vous avez besoin d'explications supplémentaires)

In [44]: g = lambda x:[lambda x:x*1, lambda x:x*x, lambda x:x*x*x, lambda x:42][x%4](x) 

In [45]: {x:g(x) for x in xrange(12)} 
Out[45]: 
{0: 0, 
1: 1, 
2: 8, 
3: 42, 
4: 4, 
5: 25, 
6: 216, 
7: 42, 
8: 8, 
9: 81, 
10: 1000, 
11: 42}