簡體   English   中英

根據lambda表達式定義命名函數和使用`def`之間是否存在差異?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM