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*y
print(s(3,3))
以上对⽐我们可以看出如果我们想计算两个数的乘积,需要定义⼀个函数,传⼊两个形参,然⽽lambda也是直接传⼊两个形参。后⾯使⽤冒号,写⼊表达式,即可得到我们所需要的结果。
lambda还可以写成以下⼏种⽅式:
lambda X:None          # 函数没有输⼊参数,输出是None
lambda *args: sum(args)    # 输⼊是任意个数参数,输出是它们的和(隐性要求输⼊参数必须能进⾏算术运算)
lambda **kwargs: 1      # 输⼊是任意键值对参数,输出是1
以下实例可以帮我们更好的理解这⼀⽤法:
import time
time.sleep = lambda X:None # 将等待时间设置内容为空
time.sleep(5) # 并不会等待5秒
answer = lambda *args: sum(args)  # 求和
answer(1,2,3)  # 得到结果为1+2+3=6
exzample = lambda **kwargs: 1  #设置返回为1
exzample(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 * val
print(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
# 实例1
sp = lambda x,y:x+y
sq = reduce(sp,[2,3,4])  # 输出结果为9
# 实例2
st = lambda x,y:x*10+y
sa = 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]]]),itera
ble为提供的序列,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])
python中lambda怎么使用
# 我们可以看到⾥⾯每个元组下标为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)
# 实例1
sp = lambda x: x>5  # 定义函数需要⼤于5
sq = filter(sp,[2,3,4,6,7])  # sq为迭代器,需要循环遍历出结果
print([i for i in sq])  # 输出结果为[6,7]
# 实例2
sp1 = 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]