码迷,mamicode.com
首页 > 其他好文 > 详细

匿名函数

时间:2018-12-10 15:42:14      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:很多   from   star   zhang   rom   语法   执行   nbsp   func   

匿名函数

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)
‘‘‘

匿名函数

标签:很多   from   star   zhang   rom   语法   执行   nbsp   func   

原文地址:https://www.cnblogs.com/wang-kai-1994/p/10096349.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!