我知道PEP8要求不将lambda赋给表达式,因为它错过了lambda函数的整个点。
但递归lambda函数怎么样?我发现在很多情况下,使用lambda将其赋值给表达式而不是定义函数是非常简单,干净和高效的。并且pep8没有提到递归lambda。
例如,让我们比较一个返回两个数字之间最大公约数的函数:
def gcd(a,b):
if b == 0:
return a
return gcd(b, a % b)
VS
gcd = lambda a, b: a if b == 0 else gcd(b, a % b)
那么,我该怎么办?
答案 0 :(得分:2)
你被骗了#34;你的问题有点,因为常规函数也可以像这样重写:
def gcd(a,b):
return a if b == 0 else gcd(b, a % b)
几乎与lambda版本一样短,甚至可以进一步挤压成一行,但代价是可读性。
lambda语法通常用于简单的匿名函数,这些函数通常作为参数传递给其他函数。将lambda函数赋值给变量并没有多大意义,它只是声明命名函数的另一种方式,但是它的可读性和限制性较低(你不能在其中使用语句)。
PEP8已经有很多想法,其中的建议是有原因的,因此我不建议偏离它,除非你有非常这样做的充分理由。
答案 1 :(得分:1)
使用正常的函数定义。使用lambda
而不是def
绝对没有任何好处,正常的函数定义(对大多数人来说)更具可读性。使用lambda,你什么也得不到,但是你经常会失去可读性。
我建议你阅读this回答。递归不会改变任何东西。事实上,在我看来,它更有利于正常def
。
答案 2 :(得分:-2)
如果您为变量指定lambda
,则无法将其作为参数传递,也不能将返回到同一行,这正是{的确切目的{1}}。