我想知道是否有可能在Python中找到一些与C#multiline lambda函数等价的东西。
我想为此方法编写一些等效的python代码。但据我所知,python中不可能有多行lambda函数。有关python等效代码的任何想法吗?
答案 0 :(得分:7)
如果将表达式放在括号中,则可以在多行上定义lambda。这会创建一个隐含的行延续,导致在关闭括号之前忽略换行符。
>>> func = lambda a,b: (
... b - a if a <= b else
... a*b
... )
>>>
>>> func(23, 42)
19
您也可以明确使用续行字符&#34; \&#34;,但这不是Python style guide首选的方法。 (并不是将lambdas绑定到名称a good idea to begin with,公平......)
>>> func = lambda a,b: \
... b - a if a <= b else \
... a*b
>>>
>>> func(23, 42)
19
当然,你只能在lambda中使用表达式,而不能使用语句。因此,正确的if
块和return
s等仍然是不可能的。
此外,可能没有必要在这里使用lambdas,因为与C#不同(在最近的v.7.0之前),Python能够嵌套完整的函数:
>>> 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
答案 1 :(得分:2)
您可以将其编写为内联函数:
lambda x, y : (x<=y)*(y-x) + (x>y)*x*y
答案 2 :(得分:2)
如果需要多行,没有理由使用lambda,而是使用范围函数定义。由于它是在方法内部定义的,因此只能在该上下文中可见。
def Method(x, y):
def func(temp1, temp2):
if temp1 <= temp2:
return temp2 - temp1
else:
return temp1 * temp2
return func(temp1, temp2)
我说任何时候你都想给lambda一个名字,除非从另一个地方传递给你的东西,使用def而不是lambda。
答案 3 :(得分:2)
有一种复杂的方法,不仅可以创建用于格式化的多行lambda,而且可以创建逻辑上真正多行的lambda。它涉及使用exec命令将字符串转换为函数。我不知道这有多有效,但它能奏效。我提出这个建议是因为有时我想为已排序的函数创建一个自定义lambda函数,而又不想定义一个持久函数。因此,请检查以下内容:
git diff master...customBranch
这将创建一个函数并返回指向该函数的指针。如果运行以下测试,将会看到有一个名为f1的函数,但没有一个名为fun1的函数。 fun1是一个占位符,因为使用def时必须有一个函数名。 exec在strToFun函数内部创建一个函数。 eval不执行该函数就返回指向该函数的指针。该函数返回指针,并且内部名为fun1的内部函数超出范围。
def strToFun(x):
name = x[x.find(' ') + 1:x.find('(')]
exec(x)
ret = eval(name)
return ret
除了将新创建的函数存储到变量之外,您还可以像使用lambda表达式一样直接使用它:
f1 = strToFun('def fun1(x): return x + 1')
print(f1, type(f1), f1(100))
print(dir())
因此,在需要时,我会像这样使用它来创建复杂的lambda:
print(strToFun('def fun1(x): return x + 1')(200))
我敢肯定,我会收到很多关于这是多么的不可思议的评论,如果Guido希望我们拥有多行lambda,他会把它放在语言中。但是,当您需要时,这是一个有趣且有效的技巧,那么这可能有什么问题呢?
答案 4 :(得分:0)
我决定稍微玩一下,最终得到以下结果:
def lambdas(x):
if not x.startswith('('):
# if the parameters are not enclosed in parentheses, supply them automatically
i = x.find(':')
x = 'def _func({0}):{1}'.format(x[:i], x[i+1:])
else:
x = 'def _func' + x
exec(x)
ret = eval('_func')
return ret
我将名称定为lambdas
,因为它看起来像lambda
,但字符串末尾的s
。我还决定跳过名称,直接进入需要包含在括号中的参数列表是有道理的。
data = ['Uganda', 'Canada', 'USA', 'Albania', 'USA']
print(sorted(data,
key = lambdas(
'''(x):
if x == 'USA':
return (0,)
elif x == 'Canada':
return (1,)
else:
return(2, x)
''')))
或
print(sorted(data,
key = lambdas(
'''x:
if x == 'USA':
return (0,)
elif x == 'Canada':
return (1,)
else:
return(2, x)
''')))