python中可以把部分语句较少的函数写为一行代码,并且不用定义函数名称,该种方法被称为lambda函数,也被称为匿名函数。匿名函数很简单,但是也有很多值得去思考的细节。
0x00 关于lambda函数
对于python这种很讲究书写格式的语言来说,lambda函数的写法不是那么pythonic,但是也不能否认lambda函数还有有一部分的有点。
- 省去定义函数的过程,让代码更为精简
- 对于一些使用次数较少,函数并非太过复杂的函数,可以省去专门定义一个函数
- 有的lambda代码,让人更容易理解。
0x01 lambda函数基础
lambda函数的写法很简单,可以通过下面的例子,看一下如果把def定义的函数转化为一个lambda函数。
def add(a,b): return a+b ret = lambda a,b:a+b
lambda函数(匿名函数)的写法为:lambda 传入参数:返回值表达式。
特别是在带key的内置函数(min,max,sorted,map,filter)中lambda函数就更为方便了。
lst = [1,2,3,4,5,6] new_lst_gen = filter(lambda x:x%2 ==0,lst) print(list(new_lst_gen))
比如上面的例题,为了找出lst中的偶数,这里就不用专门去定义一个if i%2 ==2:return i的函数了。直接在filter中的key的位置写入lambda表达式即可。
0x02 lambda函数例题分析
例题1:
def multipliers(): return [lambda x:i*x for i in range(4)] print([m(2) for m in multipliers()])
初看此题,我就没看懂m(2)是什么东西。
从第而行代码中可以看出,multipliers()返回的结果是一个列表,列表里的内容为函数。i为一个全局变量,类似于执行了4次lambda x:i*x。每for一次,i的值都在几个匿名函数中变化,直到最后一次,i定格为3。因此列表中元素为[lambda x:3*x,lambda x:3*x,lambda x:3*x,lambda x:3*x]。最终结果为[6,6,6,6]
例题2:
fs = [(lambda n: i + n) for i in range(10)] print(fs[3](4)) #13 print(fs[4](4)) #13
这题与上一题的一样,由于i是一个全局变量,因而返回的列表中的10个函数里的i都为10,因而最终结果都为13。
如何才能让我们脑海中的错误答案变为正确答案呢??既答案为7和8。
只要让我们传入参数的时候,就确定了i值,那么他就不会在受到全局变量的影响了。那么只需将lambda函数修改一下就。
fs = [(lambda n,i = i: i + n) for i in range(10)] print(fs[3](4)) #7 print(fs[4](4)) #8