匿名函数
Posted wang-kai-1994
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了匿名函数相关的知识,希望对你有一定的参考价值。
lambda:它是一个经常用作内联函数的单个表达式匿名函数。
为什么python中的lambda表单没有语句?
python中的lambda表单没有语句,因为它用于创建新的函数对象,然后在运行时返回它们。
所谓匿名,意指不再使用def这样的标准的形式来定义一个函数
lambda来创建匿名函数
比较def函数,lambda是一个表达式,而不是一个语块
定义匿名函数的关键字:lambda x, y(变量): x+y(逻辑代码体)
lambda 只是一个表达式,函数体比 def 简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,
后者的目的是调用小函数时不占用栈内存从而增加运行效率。
语法
lambda [arg1 [,arg2,.....argn]]:expression
?
lambda 参数列表:return [表达式] 变量
由于lambda返回的是函数对象(构建的是一个函数对象),所以需要定义一个变量去接收
例1
# sum = lambda arg1, arg2: arg1 + arg2 #即左边的参数,右边的是函数功能
?
# print(sum(10,20))
实例二
# infors = [{"name":"wang","age":10},{"name":"xiaoming","age":20},{"name":"banzhang","age":10}]`
?
# infors.sort(key=lambda x:x[‘age‘]
#sort是列表排序,根据年龄排序
sorted(d.items(),key=lambda x:x[1])
#这是根据字典排序的方式,x为参数,x[1]为函数功能,
print(infors)
# sorted
?
# d={‘a‘:24,‘g‘:52,‘i‘:12,‘k‘:33},#根据v值排序
?
# print(sorted(d.items(),key=lambda x:x[1],reverse=True)) #固定格式,reverse=True ,表示反向执行
# def sum(a,b,func):
?
# c=func(a,b)
?
# return c
?
# num=sum(11,22,lambda x,y:x+y)
?
# print(num)
max的用法,取最大值
# salaries={
?
# ‘egon‘:3000,
?
# ‘alex‘:100000000,
?
# ‘wupeiqi‘:10000,
?
# ‘yuanhao‘:2000
?
# }
?
# print(max(salaries,key=lambda k:salaries[k])) #比的v值,返回对应的k值
?
# def func(k):
?
# return salaries[k]
?
# print(min(salaries,key=func))
其他高阶函数
# map
?
# def f(x):
?
# return x * x
?
# print map(f,[1,2,3,4,5,6,7])
map函数接收两个参数,第一个参数为一个函数,第二个参数为一个可迭代对象
map接收的第一个参数是我们写好的映射规则,它会将第二个函数————可迭代对象依次迭代取值
然后按照映射规则去更改取到的值,再放入一个空列表,最后将结果赋值给一个变量名
# names = [‘alex‘, ‘wupeiqi‘, ‘yuanhao‘, ‘kevin‘, ‘hu老师‘]
?
# res=map(lambda x:x+‘dsb‘,names) #x是参数和定义的映射规则,names是可迭代对象
#迭代names,第一次的值是alex,然后alex作为参数写入映射规则
# print(res.__next__()) #迭代
?
# print(res.__next__()) #迭代
注意:python3中,我们得到的res是一个迭代器对象,它内部并没有存储任何东西
在调用next方法时才会取到其中的值
2,reduce函数 合并
在python3中需要从functools模块导入reduce函数
#取1-100相加的值
# from functools import reduce
?
# res = reduce(lambda x,y:x+y,[i for i in range(101)],100) #待解决
?
# print(res)
reduce函数的作用是合并。同数据类型进行合并。
如上例子,就是求从1-100的和。
同样我们也可以传入一个列表,每个元素是一个字符串,得到的结果就是一个字符串
3,filter
与map一样,接收两个参数,第一个参数是过滤规则,第二个参数接收一个可迭代对象
# names=[‘alex_dsb‘,‘wxx_sb‘,‘kevin_sb‘,‘hu_sb‘,‘egon‘]
?
# name=[]
?
# for i in names:
?
# if i.endswith(‘sb‘):
?
# name.append(i)
?
# print(i)
?
# res=filter(lambda name:name.endswith(‘sb‘),names)
作业和练习
-
将names=[‘egon‘, ‘alex_sb‘, ‘wupeiqi‘, ‘yuanhao‘]中的名字全部变大写
‘‘‘
(1)列表生成式
names=[‘egon‘, ‘alex_sb‘, ‘wupeiqi‘, ‘yuanhao‘]
names=[name.upper() for name in names]
print(names)
‘‘‘
‘‘‘
(2)for 循环
names = [‘egon‘, ‘alex_sb‘, ‘wupeiqi‘, ‘yuanhao‘]
name_1=[]
for name in names:
name_1.append(name.upper())
print(name_1)
‘‘‘
‘‘‘
(3)map函数
names=[‘egon‘, ‘alex_sb‘, ‘wupeiqi‘, ‘yuanhao‘]
names=map(lambda x:x.upper() ,names)
print(names.__next__())
2,将names=[‘egon‘, ‘alex_sb‘, ‘wupeiqi‘, ‘yuanhao‘]中以sb结尾的名字过滤掉,然后保存剩下的名字长度
‘‘‘
(1) for 循环
names=[‘egon‘, ‘alex_sb‘, ‘wupeiqi‘, ‘yuanhao‘]
name_1=[]
for name in names:
if not name.endswith(‘sb‘):
name_1.append(len(name))
print(name_1)
‘‘‘
‘‘‘
(2)列表生成式
names=[‘egon‘, ‘alex_sb‘, ‘wupeiqi‘, ‘yuanhao‘]
names=[len(name)for na
?
me in names if not name.endswith(‘sb‘)]
print(names)
‘‘‘
‘‘‘
(3)filter函数
names=[‘egon‘, ‘alex_sb‘, ‘wupeiqi‘, ‘yuanhao‘]
names=filter(lambda name:name.endswith(‘sb‘),names)
print(names)
‘‘‘
以上是关于匿名函数的主要内容,如果未能解决你的问题,请参考以下文章