初学者python笔记(匿名函数、map()函数、reduce()函数、filter()函数)

本篇是对Python中的匿名函数和map()函数、reduce()函数、filter()函数这四三大封装函数(遍历处理),以及它们的使用案例。 文末是对这几个函数用法功能的比较。

匿名函数

该函数的用法类似于C语言中的宏定义,只是这个不需要定义名字,故叫匿名函数,但它们的作用都是用来提供一个简短的函数。

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

运行结果:
<function at 0x02C07B70>
11
520
鸣人——羊村村长

map()函数

  1. 函数嵌套——把函数当做一个参数传给另外一个函数
def foo(n):
	print(n)
def bar(name):
	print("my name is %s"%name)  #使用了百分号类的字符串拼接
foo(bar('小沈阳'))
#会先传入“小沈阳”执行bar(),并输出,
#再将bar()的返回值,即None传入foo()中,并输出形参

运行结果:
my name is 小沈阳
None

  1. 低级函数封装
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)

运行结果:
[2, 4, 6, 8, 10]

  1. 高级封装函数——最接近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

运行结果:
[2, 3, 4, 5, 6]
[0, 1, 2, 3, 4]

  1. 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元组化才可以打印出对应的值

运行结果:
[2, 3, 4, 5, 6]
[‘Y’, ‘O’, ‘U’, ‘R’, ‘S’, ‘E’, ‘L’, ‘F’]
很明显,map()函数是做批量处理用的

reduce()函数

  1. 初级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

  1. 进阶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两个参数做相乘处理

运行结果:
24000

  1. 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函数 整合出新元素
发布了17 篇原创文章 · 获赞 32 · 访问量 1982

猜你喜欢

转载自blog.csdn.net/Viewinfinitely/article/details/104580800