在Python里有五大高阶函数,他们分别是lambda()匿名函数,filter()筛选函数,map()函数,reduce()函数,zip()函数。下面就让我们来详细的了解一下这五种函数的具体用法吧。
1.lambda()匿名函数
匿名函数lambda:是指一类无需定义标识符(函数名)的函数或子程序。
lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。
要点:
1,lambda 函数不能包含命令,
2,包含的表达式不能超过一个。
说明:一定非要使用lambda函数;任何能够使用它们的地方,都可以定义一个单独的普通函数来进行替换。
我将它们用在需要封装特殊的、非重用代码上,避免令我的代码充斥着大量单行函数。
lambda匿名函数的格式:冒号前是参数,可以有多个,用逗号隔开,冒号右边的为表达式。
其实lambda返回值是一个函数的地址,也就是函数对象。
'''匿名函数lambda:是指一类无需定义标识符(函数名)的函数或子程序。
lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。
要点:
1,lambda 函数不能包含命令,
2,包含的表达式不能超过一个。
说明:一定非要使用lambda函数;任何能够使用它们的地方,都可以定义一个单独的普通函数来进行替换。
我将它们用在需要封装特殊的、非重用代码上,避免令我的代码充斥着大量单行函数。
lambda匿名函数的格式:冒号前是参数,可以有多个,用逗号隔开,冒号右边的为表达式。
其实lambda返回值是一个函数的地址,也就是函数对象。'''
defsum(x,y):return x+yprint(sum(4,6))
f=lambda x,y:x+yprint(f(4,6))#这俩个例子的效果是一样的,都是返回x+y
a=lambda x:x*xprint(a(4)) #传入一个参数的lambda函数 返回x*x
b=lambda x,y,z:x+y*zprint(b(1,2,3)) #返回x+y*z 即1+2*3=7
#2.方法结合使用
from functools importreduce
foo=[2, 18, 9, 22, 17, 24, 8, 12, 27]print(list(filter(lambda x:x%3==0,foo))) #筛选x%3==0 的元素
print(list(map(lambda x:x*2+10,foo))) #遍历foo 每个元素乘2+10 再输出
print(reduce(lambda x,y:x+y,foo)) #返回每个元素相加的和
2.filter函数()
filter() 函数是一个对于可迭代对象的过滤器,过滤掉不符合条件的元素,
返回的是一个迭代器,如果要转换为列表,可以使用 list() 来转换。
该函数接收两个参数,第一个为函数的引用或者None,第二个为可迭代对象,
可迭代对象中的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到迭代器中
下面看下fiter()的用法:
'''filter() 函数是一个对于可迭代对象的过滤器,过滤掉不符合条件的元素,
返回的是一个迭代器,如果要转换为列表,可以使用 list() 来转换。
该函数接收两个参数,第一个为函数的引用或者None,第二个为可迭代对象,
可迭代对象中的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到迭代器中
下面看下fiter()的用法:'''my_list=[1,2,'',3,4,'6',' ']
new_list=list(filter(None,my_list))print(new_list)#None 函数 过滤掉'' 而不是过滤掉空字符串
defis_oushu(x):return x%2==0
new_list=list(filter(is_oushu,list(range(1,11))))print(new_list)#过滤掉不是偶数的数
a=[1,2,3,4,5,6,2,2,2,]print(list(filter(lambda x:x!=2,a)))#筛选出列表里所有的不是 2 的元素
3.map函数详解
map()函数
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,
并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9]
如果希望把list的每个元素都作平方,就可以用map()函数:
因此,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算:
'''map()函数
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,
并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9]
如果希望把list的每个元素都作平方,就可以用map()函数:
因此,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算:'''list=[1,2,3,4,5,6,7,8,9]deff(x):return x*x
list1=map(f,list)print(list1)for i inlist1:print(i)'''注意:map()函数不改变原有的 list,而是返回一个新的 list。
利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。
由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,
事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。
任务
假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则,
请利用map()函数,把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的'''
defformat_name(s):
s1=s[0:1].upper()+s[1:].lower()returns1
names=['adam', 'LISA', 'barT']print (map(format_name, names)) #python2 这样写可以直接输出列表
for i inmap(format_name,names):print(i) #python3 得这样写才可以
4.reduce函数详解
在python3中如果使用reduce需要先导入
from functools import reduce
reduce函数,reduce函数会对参数序列中元素进行累积。
reduce函数的定义:
reduce(function, sequence [, initial] ) -> value
function参数是一个有两个参数的函数,reduce依次从sequence中取一个元素,
和上一次调用function的结果做参数再次调用function。
第一次调用function时,如果提供initial参数,
会以sequence中的第一个元素和initial作为参数调用function,
否则会以序列sequence中的前两个元素做参数调用function。
'''在python3中如果使用reduce需要先导入
from functools import reduce
reduce函数,reduce函数会对参数序列中元素进行累积。
reduce函数的定义:
reduce(function, sequence [, initial] ) -> value
function参数是一个有两个参数的函数,reduce依次从sequence中取一个元素,
和上一次调用function的结果做参数再次调用function。
第一次调用function时,如果提供initial参数,
会以sequence中的第一个元素和initial作为参数调用function,
否则会以序列sequence中的前两个元素做参数调用function。'''
from functools importreduce
lst=[1,2,3,4,5,6]deff(x,y):return x+yprint(reduce(f,lst))'''过程1+2+3+4+5+6=21'''
print(reduce(lambda x,y:x*y,lst))#运行过程为1*2*3*4*5*6=720
#来个稍微复杂的
print(reduce(lambda x,y:x*y+1,lst))'''运算步骤:1*2+1=3
3*3+1=10
10*4+1=41
41*5+1=206
206*6+1=1237'''
#再说说有初始化值的情况, 这个时候就不是取列表的前两项, 而是取初始值为第一个,#序列的第一个元素为第二个元素,开始进行lambda函数的应用计算.
print(reduce(lambda x,y:x+y,lst,5))'''计算步骤:5+1=6
6+2=8
8+3=11
11+4=15
15+5=20
20+6=26'''
5.zip函数详解
#zip函数接受任意多个可迭代对象作为参数,将对象中对应的元素打包成一个tuple,然后返回一个可迭代的zip对象.
#这个可迭代对象可以使用循环的方式列出其元素
#若多个可迭代对象的长度不一致,则所返回的列表与长度最短的可迭代对象相同.
#zip函数接受任意多个可迭代对象作为参数,将对象中对应的元素打包成一个tuple,然后返回一个可迭代的zip对象.#这个可迭代对象可以使用循环的方式列出其元素#若多个可迭代对象的长度不一致,则所返回的列表与长度最短的可迭代对象相同.
#1.用列表生成zip对象
x=[1,2,3]
y=[4,5,6]
z=[7,8,9]
h=['a','b','c','d']
zip1=zip(x,y,z)print(zip1)for i inzip1:print(i)
zip2=zip(x,y,h)for i inzip2:print(i)
zip3=zip(h)for i inzip3:print(i)
zip4=zip(*h*3)for i inzip4:print(i) #这是干啥哟。。
print('==*=='*10)#2.二维矩阵变换
l1=[[1,2,3],[4,5,6],[7,8,9]]print(l1)print([[j[i] for j in l1] for i inrange(len(l1[0])) ])
zip5=zip(*l1)for i inzip5:print(i)
以上就是五大高阶函数的具体用法。。。希望大家可以学到一些东西。。。