2017-03-22 42 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来代替。