2012-12-10 68 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)] 

這是什麼順序的下一個值?Python的拉姆達在lambda

+2

那你試試? – glglgl

+1

線'[X%4](x)的誤差'出來。你想在那一行做什麼? –

+0

這是一門功課考試或問題? –

回答

6

你嘗試了嗎?

>>> 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] 

下面是每個價值是如何計算的:

[ 
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 
] 

基本上g(x)調用列表中的其中一個功能與x作爲參數,在列表理解與xrange它會循環調用時功能,每第四次調用都是相同的功能。

我知道這只是一個練習來幫助理解Python,但是您應該注意,這是非常低效的代碼,因爲在每次調用g()時都會重新創建所有四個函數。如果你真的需要這種行爲會更好,只是創建def功能包含幾個if語句(這將使代碼更具可讀性以及)。

+0

這是一個從這裏得克薩斯州奧斯汀的學習Python聚會組一門功課的考試。這是一個非常有用的答案。教練將其描述爲一種被動的侵略性運動,我很難回答它。 – user1893012

0

我想這樣做是爲了得到一個更好的主意來發生的事情(發表評論,如果您需要進一步的說明)

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}