2016-04-28 13 views
-1

是否可以用普通函數替換任何lambda函數?在Python中用普通函數替換lambda

e.g. lst1 = [lambda x:x*i for i in range(5)] 
     lst2 = [j(2) for j in lst1] 

這裏我們可以用普通函數代替lambda?

如果可能的話請告訴如何去做。

謝謝!

+0

它始終是可能的。 lambda只是一個簡單的單行函數。什麼讓你困惑? –

+0

請注意,使用'[lambda x:x * i for range in(5)]''你會遇到經典的[在Python中捕獲什麼(lambda)函數閉包?](http://stackoverflow.com/questions/ 2295290/what-do-lambda-function-closures-capture-in-python)問題。 –

+0

@DanielRoseman你能轉換上面的例子替換lambda與正常的功能。我沒有得到如何做到這一點。 – user2550098

回答

1

yes - lambda實際上是「make function」;你需要給它一個名字

lst1 = [lambda x:x*i for i in range(5)] 

def replace_lambda(x): 
    return x * x 

lst2 = [replace_lambda for i in range(5)] 

print lst1 
print lst2 

for idx, func in enumerate(lst1): 
    print func(idx) 

for idx, func in enumerate(lst2): 
    print func(idx) 

結果:

[<function <lambda>>, <function <lambda>>, <function <lambda>>, <function <lambda>>, <function <lambda>>] 
[<function replace_lambda>, <function replace_lambda>, <function replace_lambda>, <function replace_lambda>, <function replace_lambda>] 
0 
1 
4 
9 
16 
0 
1 
4 
9 
16 
1

是的,你可以使用functools.partial

from functools import partial 

def fun(x, i): 
    return x * i 

lst1 = [partial(fun, i=i) for i in range(5)] 
lst2 = [j(2) for j in lst1] 
+1

更快2秒,但我想這是OP等待的答案! –

+0

OP的'lst2'確實打印了'[8,8,8,8,8'],但是因爲在循環結束時i是4,但我不認爲這是他想要的。 – AKS

+0

嘿謝謝AKS,但輸出不同。我們可以改變它是否有相同的o/p即[8,8,8,8,8]?我不知道這個部分的概念。謝謝你:) – user2550098