匿名函数

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

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)

 

作业和练习

  1. 将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)
‘‘‘


























































































以上是关于匿名函数的主要内容,如果未能解决你的问题,请参考以下文章

repost对JAVASCRIPT匿名函数的理解(透彻版)

如何启动匿名线程类

匿名函数

匿名函数的用法

使用匿名函数瓶颈提高 matlab 代码的性能

函数式编程——匿名函数