Python匿名函数lambda知识点

python中可以把部分语句较少的函数写为一行代码,并且不用定义函数名称,该种方法被称为lambda函数,也被称为匿名函数。匿名函数很简单,但是也有很多值得去思考的细节。

python

0x00 关于lambda函数

对于python这种很讲究书写格式的语言来说,lambda函数的写法不是那么pythonic,但是也不能否认lambda函数还有有一部分的有点。

  1. 省去定义函数的过程,让代码更为精简
  2. 对于一些使用次数较少,函数并非太过复杂的函数,可以省去专门定义一个函数
  3. 有的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

发表评论