2016-07-14 90 views
3

我開始欣賞lambda表達式在Python中的價值,特別是當涉及到函數式編程,mapfunctions returning functions等等。但是,我也一直在函數內命名lambda,因爲:pythonic是否pythonic:命名lambdas

  • 我需要幾次相同的功能並且不想重複代碼。
  • 該功能是特定於它出現的功能;其他地方不需要。

當我遇到滿足上述條件的情況時,我一直在編寫一個命名的lambda表達式,以實現DRY和狹義範圍的功能。例如,我正在編寫一個可以在一些numpy數組上運行的函數,並且我需要對傳遞給該函數的所有數組進行適度繁瑣的索引(這可以輕鬆地放在一行中)。我寫了一個名爲lambda表達式的索引,而不是在整個函數定義中編寫整個其他函數或複製/粘貼索引。

def fcn_operating_on_arrays(array0, array1): 
    indexer = lambda a0, a1, idx: a0[idx] + a1[idx] 

    # codecodecode 

    indexed = indexer(array0, array1, indices) 

    # codecodecode in which other arrays are created and require `indexer` 

    return the_answer 

這是濫用python的lambdas嗎?我應該把它吸起來並定義一個單獨的函數嗎?

編輯

也許值得鏈接function inside function

+1

不,它不是Python的。根據定義,lambda是匿名函數,用於簡化函數作爲參數的使用(就像在'sort()'中),你可以命名它,但你最好使用已知的'def',這更容易理解。 – Delgan

回答

6

這不符合Python和PEP8 discourages it

始終使用DEF語句,而不是一個賦值語句 直接綁定lambda表達式的一個標識符。

是:

def f(x): return 2*x 

號:

f = lambda x: 2*x 

第一種形式是指所得到的功能對象的名稱是 具體'f'代替通用'<lambda>'。一般而言,這對於回溯和字符串表示更有用。賦值語句的使用 消除的唯一好處在一個lambda表達式 能提供明確的高清聲明(即它可以 被嵌入一個更大的表達式中)

1

這些功能(無雙關語意思)相同。

indexer = lambda a0, a1, idx: a0[idx] + a1[idx] 

def indexer(a0, a1, idx): 
    return a0[idx] + a1[idx] 

如果您對其中一個或另一個有美學偏好,那就使用它。

4

我寫了一個名爲lambda表達式做的,而不是寫一個整體的其他功能

好索引,你寫一個整體的其他功能。你只是用一個lambda表達式來寫它。

爲什麼不使用def?你會得到更好的堆棧跟蹤和更多的語法靈活性,而且你不會失去任何東西。它不象def不能在另一個函數內部發生:

def fcn_operating_on_arrays(array0, array1): 
    def indexer(a0, a1, idx): 
     return a0[idx] + a1[idx] 
    ... 
+0

pythonic是如何在另一個函數中「def」的?每當我看到有人這樣做,他們都在濫用它。 –

+0

@ joshua.r.smith:在另一個函數中放置一個'def'完全沒問題。人們在裝飾者或其他需要封閉的情況下都會一直這樣做。我個人更喜歡在內部函數不使用任何閉包變量時避免它,因爲能夠訪問函數以進行測試或交互式使用很方便。 – user2357112

+1

這就是裝飾者的工作原理,所以我會說「很」。 –