|
楼主 |
发表于 2020-3-1 23:53:43
|
显示全部楼层
今天主要是对Python中的匿名函数和map()函数、reduce()函数、filter()函数这四三大封装函数(遍历处理),以及它们的使用案例。 最后那些是函数用法功能的比较。
匿名函数
匿名函数,它们的作用是用来提供一个简短的函数。
print(lambda x:x+1) #打印匿名函数的内存地址
func1 = lambda x:x+1 #调用匿名函数第1步
func2 = lambda x,y:x*y #两个参数的匿名函数
print(func1(10)) #调用匿名函数第2步
print(func2(4,130)) #需要传入两个参数以符合x,y
name = '鸣人'
func3 = lambda x:x + '——羊村村长'
print(func3(name))
12345678
运行结果:
<function at 0x02C07B70>
鸣人——羊村村长
map()函数
函数嵌套——把函数当做一个参数传给另外一个函数
def foo(n):
print(n)
def bar(name):
print("my name is %s"%name) #使用了百分号类的字符串拼接
foo(bar('小沈阳'))
#会先传入“小沈阳”执行bar(),并输出,
#再将bar()的返回值,即None传入foo()中,并输出形参
运行结果:
my name is 小沈阳
None
低级函数封装
num_1 = [1,2,3,4,5]
def map_test(array):
ret = []
for i in array: #把列表中的所有元素都乘2
ret.append(i*2)
return ret #可以返回一个列表
ret = map_test(num_1) #执行封装函数
print(ret)
12345678
运行结果:
[2, 4, 6, 8, 10]
高级封装函数——最接近map()函数的本质
num_1 = [1,2,3,4,5]
def cut_one(x): #定义一个做减1运算的函数
return x-1
def add_one(x): #定义一个做加1运算的函数
return x+1
def map_test(func,array): #定义一个做全部遍历的函数,并执行相关操作的函数
ret=[]
for i in array:
res=func(i) #add_one
ret.append(res)
return ret
print(map_test(add_one,num_1)) #加1
print(map_test(cut_one,num_1)) #减1
12345678910111213
运行结果:
[2, 3, 4, 5, 6]
[0, 1, 2, 3, 4]
map()函数+匿名函数——终极用法
传入一个函数和一个列表到封装函数中,好处是可以根据需求传入各种定义的函数,将列表中所有的元素做处理
#第一个参数是一个函数,第二个参数是一个可迭代对象(可循环的)
num_1 = [1,2,3,4,5]
res = map(lambda x:x+1,num_1) #每个数都加1
print(list(res)) #打印的时候必须输出列表
msg='yourself'
print(list(map(lambda x:x.upper(),msg))) #将所有字符都变大写
#map()函数返回的是内存地址,需要list列表化或者tuple元组化才可以打印出对应的值
1234567
运行结果:
[2, 3, 4, 5, 6]
[‘Y’, ‘O’, ‘U’, ‘R’, ‘S’, ‘E’, ‘L’, ‘F’]
很明显,map()函数是做批量处理用的
reduce()函数
初级reduce()——简单的单函数
num = [1,2,3,4,5,6,100]
def reduce_test(array):
res = 0
for n in array: #将num中的元素都累加起来
res += n
return res
print(reduce_test(num))
运行结果:121
进阶reduce()——函数嵌套
num = [1,2,3,4,5,100]
def reduce_test(func,array,init=None): #某参数=None则为非必须参数
if init == None:
res = array.pop(0)
#用户没有输入值,则将第一个值赋值给res,并且删除第一个值,实现每乘完一个就取出一个
else:
res = init #用户输入了一个值
for n in array: #将num中的元素都累乘起来
res = func(res,n) #传入的两个参数是需要相乘的两个数,每次都传入了func相乘后都更新res的值
return res
print(reduce_test(lambda x,y:x*y, num, 2))
#该匿名函数接收两个参数对x,y两个参数做相乘处理
123456789101112
运行结果:
24000
reduce()函数——终极reduce
注意:该函数使用前需要从functools库中导入。即:
from functools import reduce
from functools import reduce
num = [1,2,3,4,5,100]
print(reduce(lambda x,y:x*y, num, 2))
#reduce函数必须导入functools模块,且第三个参数是非必须参数,为初始值
运行结果:
24000
很明显,reduce()函数做整合用的。
filter()函数
这个函数在2020年2月28日的一篇文章里已经专门介绍了,这里就不做详细分析,只拿出最后的用法。
people_onepiece=[
{'name':'路飞','age':19}, #列表中有5个字典,每个字典都有2个键值对
{'name':'娜美','age':20},
{'name':'山治','age':22},
{'name':'乔巴','age':12},
{'name':'乌索普','age':21}
]
print(list(filter(lambda n:n['age']<=20,people_onepiece)))
#传入的参数是一个判断年龄的匿名函数,一个列表
#如果年龄小于20岁,则将该字典保留下来
运行结果:
[{‘name’: ‘路飞’, ‘age’: 19}, {‘name’: ‘娜美’, ‘age’: 20}, {‘name’: ‘乔巴’, ‘age’: 12}]
很明显,filter()函数是做筛选用的
map()函数,filter()函数,reduce()三大批量处理函数总结:
map函数是将一个列表中所有的元素都处理了一遍(最终返回的还是一个完整列表,位置和顺序都不变)
filter函数是将一个列表中所有的元素筛选了一遍,判断每个元素得到的布尔值(最终返回的是被筛选过的元素组成的一个列表)
reduce函数是把一个完整的列表都整合出另一个数据,或累加结果,或累乘结果(最终返回的是一个元素)
map函数
每个元素都会变
filter函数
保留符合条件的元素
reduce函数
整合出新元素 |
|