是否可以用普通函數替換任何lambda函數?在Python中用普通函數替換lambda
e.g. lst1 = [lambda x:x*i for i in range(5)]
lst2 = [j(2) for j in lst1]
這裏我們可以用普通函數代替lambda?
如果可能的話請告訴如何去做。
謝謝!
是否可以用普通函數替換任何lambda函數?在Python中用普通函數替換lambda
e.g. lst1 = [lambda x:x*i for i in range(5)]
lst2 = [j(2) for j in lst1]
這裏我們可以用普通函數代替lambda?
如果可能的話請告訴如何去做。
謝謝!
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
是的,你可以使用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]
更快2秒,但我想這是OP等待的答案! –
OP的'lst2'確實打印了'[8,8,8,8,8'],但是因爲在循環結束時i是4,但我不認爲這是他想要的。 – AKS
嘿謝謝AKS,但輸出不同。我們可以改變它是否有相同的o/p即[8,8,8,8,8]?我不知道這個部分的概念。謝謝你:) – user2550098
它始終是可能的。 lambda只是一個簡單的單行函數。什麼讓你困惑? –
請注意,使用'[lambda x:x * i for range in(5)]''你會遇到經典的[在Python中捕獲什麼(lambda)函數閉包?](http://stackoverflow.com/questions/ 2295290/what-do-lambda-function-closures-capture-in-python)問題。 –
@DanielRoseman你能轉換上面的例子替換lambda與正常的功能。我沒有得到如何做到這一點。 – user2550098