![](/img/trans.png)
[英]Is there any difference between using lambda as a function and using lambda with map?
[英]Are there difference between defining a named function in terms of lambda expressions and using `def`?
根據lambda表達式定義命名函數和使用def
有區別嗎?
例如,以下兩種方式定義兩個等效函數?
adder = lambda x, y: x+y
和
def adder(x,y):
return x+y
謝謝。
在結構上它們是等價的。 但是,從PEP 8 :
始終使用
def
語句而不是將lambda表達式直接綁定到標識符的賦值語句。是:
def f(x): return 2*x
否:
f = lambda x: 2*x
第一種形式意味着生成的函數對象的名稱特別是'f'而不是通用的'lambda'。 這對於一般的回溯和字符串表示更有用。 賦值語句的使用消除了lambda表達式在顯式def語句上提供的唯一好處(即它可以嵌入到更大的表達式中
因此,這意味着你應該只使用嵌入在較大表達式中的lambdas,為了更簡潔的代碼,而不是為它們分配一個對象,其中美學整潔的好處被上面提到的缺點所淹沒。
除了具有便於打印的名稱之外,在該示例中沒有。 一般來說,一個很大的區別是,你不能在lambda中包含語句(不適用於你的例子,但值得了解)。
例如:
def foo():
x = 2 #can't do in lambda
return x
長話短說,沒有區別。 唯一的細微差別是缺少嵌入到函數對象中的特定名稱。 這使得一些工具,例如Python的內置multiprocessing
與lambda函數不兼容(在multiprocessing
情況下,它是由於pickle
無法序列化lambda),盡管類似的包multiprocess
確實支持它們。
它們是有區別的。 Lambdas可以更容易地生成可能以意想不到的方式運行的閉包。
這是一個例子:
def create_multipliers_fun():
def multiplier_factory(i):
def multiplier(x):
return i * x
return multiplier
# here, an array of functions is returned
# each multiplies the input value by the value `i` received in the loop
return [multiplier_factory(i) for i in range(5)]
# prints 0 2 4 6 8
for multiplier in create_multipliers_fun():
print multiplier(2)
def create_multipliers_lambda():
# here, all returned functions use the latest available version
# of the variable `i` (closure with late binding)
return [lambda x : i * x for i in range(5)]
# prints 8 8 8 8 8
for multiplier in create_multipliers_lambda():
print multiplier(2)
使用lambdas,你處理一個后期綁定閉包更不明顯。
為了比較:
def create_multipliers_closure():
def multiplier(x):
return i * x
return [multiplier for i in range(5)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.