在学习Python的过程中,lambda的语法时常会使人感到困惑,那么lambda是什么,为什么要使用lambda,是不是必须使用lambda?

可以这样认为,lambda作为一个表达式,定义了一个匿名函数,通过lambda能够简化函数定义的书写形式,使代码更为简洁,但函数定义更容易理解,方便理解方便维护。

lambda 除了让代码减少之外,没有任何的益处,反倒让初学者调试了理解起来更加困难。

我们看看下面几种情况,相信大家都能有一些自己的取舍。

add = lambda x, y: x+y
print add(1, 2)
执行结果:
3

我们可以通过函数定义的方式进行实现

def add(x, y):
    return x + y

print add(1, 2)
执行结果:
3

求和参数不定的情况

add = lambda *agrs: sum([x for x in agrs])
print add(1, 2, 4, 5, 6, 7, 8, 9)
执行结果:
42

我们依然可以通过函数定义的方式进行实现

def add(*agrs):
    return sum([x for x in agrs])

print add(1, 2, 4, 5, 6, 7, 8, 9)
执行结果:
42

再来看看下面这个情况,比如我们要测试一个函数,该函数有三个参数,每个参数都有自己的取值范围,假设我们要把所有的情况测试一下。

我们可以通过for循环嵌套的形式,通过组合列表的形式,也可以用lambda形式。

for x in range(3):
    for y in range(3):
        for z in range(3):
            print (x, y, z)
combo = [(x, y, z) for x in range(3) for y in range(3) for z in range(3)]
print "\n".join([str(item) for item in combo])
combo = lambda (x, y, z): [(i, j, k) for i in range(x) for j in range(y) for k in range(z)]
print combo((3, 3, 3))
都能得到同样的结果:
(0, 0, 0)
(0, 0, 1)
(0, 0, 2)
(0, 1, 0)
(0, 1, 1)
(0, 1, 2)
(0, 2, 0)
(0, 2, 1)
(0, 2, 2)
(1, 0, 0)
(1, 0, 1)
(1, 0, 2)
(1, 1, 0)
(1, 1, 1)
(1, 1, 2)
(1, 2, 0)
(1, 2, 1)
(1, 2, 2)
(2, 0, 0)
(2, 0, 1)
(2, 0, 2)
(2, 1, 0)
(2, 1, 1)
(2, 1, 2)
(2, 2, 0)
(2, 2, 1)
(2, 2, 2)

对于程序设计以及编码实现,我们首先要考虑的是功能逻辑的实现,如果逻辑复杂我更倾向于选择函数,为了简洁而简洁需要花费更长的时间而且还会带来维护上的风险(因为不确定将来维护的人以及这个人的理解能力如何)。

当然对于逻辑很简单的可以使用lambda或者通过for/in/…等组合而成的简单语句。

因此,对于lambda是否使用完全取决于编程者的喜好,不要因为用了lambda而给自己刨坑,痛苦的是自己掉了进去。

个人觉得一个优秀的程序员应具备一些共同的好习惯:

  • 为代码添加注释,一是别人会接手,二是自己将来也可能遗忘
  • 避免重复造轮子(Do Not Repeat Youself)
  • 封装,将相近的功能封装成模块,做成通用的功能
  • 保持代码清晰简洁容易理解
  • 自注释代码,用有实际意义的名称(函数,参数,变量等)
  • ……

 


 

print [x for x in range(10) if x % 2 == 0]
print list(filter(lambda x: x % 2 == 0, range(10)))

程序输出:
[0, 2, 4, 6, 8]
[0, 2, 4, 6, 8]