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
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
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).
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
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}
Qu'avez-vous essayé? – glglgl
La ligne '[x% 4] (x)' renvoie une erreur. Qu'essayez-vous de faire dans cette ligne? –
Est-ce un devoir ou une question d'examen? –