将lambda分配给表达式进行递归? (PEP8)

时间:2015-09-24 15:28:36

标签: python python-3.x recursion syntax pep8

我知道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)

那么,我该怎么办?

3 个答案:

答案 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}}。