python之lambda匿名函数的使用详解

网友投稿 523 2022-08-28


python之lambda匿名函数的使用详解

一,lambda函数的概念

匿名函数就是不需要显式的指定函数名。

关键字lambda表示匿名函数,冒号前面的n表示函数参数,可以有多个参数。匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:有些函数在代码中只用一次,而且函数体比较简单,使用匿名函数可以减少代码量,看起来比较"优雅“。

lambda函数被称为匿名函数,实际就是说没有名称的函数,形式如下:

lambda [arg1 [,arg2,.....argn]]:expression

args指的是参数,expression指条件表达式,根据参数,进行条件表达后输出相应内容。

匿名函数返回的结果是expression条件表达式的结果。

二,lambda简单使用

# 普通用法def detail(x,y): return x*y# lambda用法 s = lambda x,y:x*yprint(s(3,3))

以上对比我们可以看出如果我们想计算两个数的乘积,需要定义一个函数,传入两个形参,然而lambda也是直接传入两个形参。后面使用冒号,写入表达式,即可得到我们所需要的结果。

lambda还可以写成以下几种方式:

lambda X:None # 函数没有输入参数,输出是Nonelambda *args: sum(args) # 输入是任意个数参数,输出是它们的和(隐性要求输入参数必须能进行算术运算)lambda **kwargs: 1 # 输入是任意键值对参数,输出是1

以下实例可以帮我们更好的理解这一用法:

import timetime.sleep = lambda X:None # 将等待时间设置内容为空time.sleep(5) # 并不会等待5秒answer = lambda *args: sum(args) # 求和answer(1,2,3) # 得到结果为1+2+3=6exzample = lambda **kwargs: 1 #设置返回为1exzample(a=2,b=4) # 得到结果为1

三,lambda结合python内置函数高阶用法

lambda常用高阶函数:

map()函数reduce() 函数sorted() 函数filter() 函数

map()函数:

​​map()​​函数接收两个参数,一个是函数,一个是​​Iterable​​,​​map​​将传入的函数依次作用到序列的每个元素,并把结果作为新的​​Iterator​​返回。

遍历序列,对序列中每个元素进行函数操作,最终获取新的序列。

map() 会根据提供的括号内函数对给出的序列做一一映射。map(function,iterable,......),这个是map函数的形式,function为所指定的函数,iterable为所提供的序列,可为多个序列。

sp = lambda x:x**2 # 定义一个lambda函数sq = map(sp,[2,3,4,5]) # 结合map()函数使用,依次对列表中的数据求平方print([i for i in sq]) # 循环打印出sq中的数据

1.求列表[1,2,3,4,5,6,7,8,9],返回一个n*n 的列表

#一般解决方案li = [1,2,3,4,5,6,7,8,9]for ind,val in enumerate(li): li[ind] = val * valprint(li)# [1, 4, 9, 16, 25, 36, 49, 64, 81]# 高级解决方案li = [1,2,3,4,5,6,7,8,9]print(list(map(lambda x:x*x,li)))# [1, 4, 9, 16, 25, 36, 49, 64, 81]

reduce() 函数:

​​reduce​​把一个函数作用在一个序列​​[x1, x2, x3, ...]​​上,这个函数必须接收两个参数,​​reduce​​把结果继续和序列的下一个元素做累积计算,其效果就是:

reduce(func,[1,2,3]) 等同于 func(func(1,2),3)

对于序列内所有元素进行累计操作

from functools import reduce # 引入reduce函数sp = lambda x,y:x*y # 定义两个数相乘sq = reduce(sp,[2,3,4]) # 结果计算实际为,2*3*4,输出结果为24

reduce实际运行原理,就是前面的数据对后面的数据累加进行function函数的运算。

from functools import reduce# 实例1sp = lambda x,y:x+ysq = reduce(sp,[2,3,4]) # 输出结果为9# 实例2st = lambda x,y:x*10+ysa = reduce(st,[1,2,3,4]) # 计算过程为1*10+2-->12*10+3-->123*10+4,输出结果为1234

sorted() 函数:

sorted(iterable, /, *, key=None, reverse=False)

接收一个​​key​​函数来实现对可迭代对象进行自定义的排序

可迭代对象:主要与列表,字符串,元祖,集合和字典

key:接受一个函数,根据此函数返回的结果,进行排序

reverse:排序方向,默认为从小到大,reverse=True为逆向

sorted() 函数对所有可迭代的对象进行排序操作,语法类型为sorted(iterable[,.....],key[, reverse]]]),iterable为提供的序列,key[,reverse]指根据什么进行排序,排序的规则;reverse = True 降序 , reverse = False 升序(默认)。

list1 = [3,4,1,6,8,4]list2 = sorted(list1) # 对list1按照0-9排序,结果为[1, 3, 4, 4, 6, 8]

以上是对单字符类型的数据进行排序,下面看下多类型的:

L=[('b',4),('a',3),('c',2),('d',1)] # x[1]实际是根据里面每个元组的下标进行排序M = sorted(L,key=lambda x:x[1])# 我们可以看到里面每个元组下标为1时,都为数字,4,3,2,1,所以得出结果为# [('d', 1), ('c', 2), ('a', 3), ('b', 4)]W = sorted(L,key=lambda x:x[0]) # 以上W的结果输出为[('a', 3), ('b', 4), ('c', 2), ('d', 1)],根据字母a-z排序

我们还可以按照两种及多种的排序的规则进行排序:

students = [('jahn', 'A', 15), ('jahn', 'B', 12), ('dave', 'B', 10)]s = sorted(students,key=lambda x:[x[0],x[1]])# 输出结果为[('dave', 'B', 10), ('jahn', 'A', 15), ('jahn', 'B', 12)]

以上我们可以看到,是按照X[0],X[1],意思是指,先根据下标0排序,当遇到重复情况下,再依次进行下标为1的排序。

L=[('b',4),('a',3),('c',2),('d',1)]M = sorted(L,key=lambda x:x[0],reverse=True) # reverse=True倒序排列# 输出结果为[('d', 1), ('c', 2), ('b', 4), ('a', 3)]

# 把下面单词以首字母排序li = ['bad', 'about', 'Zoo', 'Credit']print(sorted(li, key = lambda x : x[0]))# 输出['Credit', 'Zoo', 'about', 'bad']"""对字符串排序,是按照ASCII的大小比较的,由于'Z' < 'a',结果,大写字母Z会排在小写字母a的前面。"""# 假设我们用一组tuple表示学生名字和成绩:L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]# 请用sorted()对上述列表分别按名字排序print(sorted(L, key = lambda x : x[0]))# 输出[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]# 再按成绩从高到低排序print(sorted(L, key = lambda x : x[1], reverse=True))# 输出[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]

filter() 函数:

​​filter()​​也接收一个函数和一个序列。和​​map()​​不同的是,​​filter()​​把传入的函数依次作用于每个元素,然后根据返回值是​​True​​还是​​False​​决定保留还是丢弃该元素。

对于序列中的元素进行筛选,最终获取符合条件的序列

filter() 函数是用来过滤掉不符合的序列,保留符合函数规则的序列输出,语法类型为filter(function, iterable)

# 实例1sp = lambda x: x>5 # 定义函数需要大于5sq = filter(sp,[2,3,4,6,7]) # sq为迭代器,需要循环遍历出结果print([i for i in sq]) # 输出结果为[6,7]# 实例2sp1 = lambda x: x%3==0 # 判断能否被3整除的数sq1 = filter(sp1,[2,3,4,6,7])print([i for i in sq1]) # 输出结果为[3,6]

# 在一个list中,删掉偶数,只保留奇数li = [1, 2, 4, 5, 6, 9, 10, 15]print(list(filter(lambda x:x % 2==1,li))) # [1, 5, 9, 15]# 回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回数li = list(range(1, 200))print(list(filter(lambda x:int(str(x))==int(str(x)[::-1]),li)))[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191]

去期待陌生,去拥抱惊喜。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python之hasattr() getattr() setattr() delattr()函数使用方法详解(pythOn)
下一篇:Java实现马踏棋盘算法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~