2017-03-22 41 views
2

我想知道是否有可能找到一些相當於Python中的C#多行lambda函數。Python多行lambda

比方說,我有C#代碼: enter image description here

我想寫這個方法相當於一些Python代碼。但據我所知,在Python中不可能有多行lambda函數。關於一些python等效代碼的任何想法?

+5

即使有辦法,使用它的理由是什麼?您已經爲該函數定義了一個名稱('func'),並且已經使用多行,爲什麼不使用標準的'def'?另外,Python lambda只允許包含表達式(if'if') – DeepSpace

+0

在這種特殊情況下,它可以被重寫爲C#或Python中的單行('t1,t2)=> t1 <= t2? t2 - t1:t1 * t2'。 – juharr

回答

7

如果將表達式放在圓括號中,可以在多行上定義lambda表達式。這創建了一個隱含的行連續,導致直到右括號忽略換行符。

>>> func = lambda a,b: (
...  b - a if a <= b else 
...  a*b 
...) 
>>> 
>>> func(23, 42) 
19 

,也可以明確使用續行字符「\」,但這不是由Python style guide首選方法。 (不,結合lambda表達式來名a good idea to begin with,在公平...)

>>> func = lambda a,b: \ 
...  b - a if a <= b else \ 
...  a*b 
>>> 
>>> func(23, 42) 
19 

當然,你只能有你的拉姆達內的表達式,而不是語句。所以正確的if塊和return等仍然是不可能的。


此外,可能沒有必要在所有在這裏使用lambda表達式,因爲不像C#,Python是能夠嵌套功能全(前最近v 7.0):

>>> def method(x,y): 
...  def func(a,b): 
...    if a <= b: 
...      return b - a 
...    return a * b 
...  return func(x,y) 
... 
>>> method(23, 42) 
19 
+0

其實我認爲C#7的本地函數可能像Python嵌套函數一樣。 – juharr

+0

@juharr,哦,很好。我期待着使用它們:-) – Kevin

2

你可以將它寫成內聯函數:

lambda x, y : (x<=y)*(y-x) + (x>y)*x*y 
+0

這讓我回到古代BASIC方言的那些日子,那裏的建築很常見。雖然我們做的稍微有點不同,因爲比較結果返回-1爲真。 –

2

如果您需要多行,則不需要使用lambda表達式,而是使用作用域函數定義。由於它在方法內部定義,所以只能在該上下文內部看到。

def Method(x, y): 
    def func(temp1, temp2): 
     if temp1 <= temp2: 
      return temp2 - temp1 
     else: 
      return temp1 * temp2 

    return func(temp1, temp2) 

我說任何時候,你都忍不住給拉姆達的名稱,除東西傳遞給你換個地方,使用拉姆達的DEF來代替。