开发者学堂课程【Python 入门 2020年版: Filter&map&reduce 方法】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10342
Filter&map&reduce 方法
内容介绍
一、 filter 内置类的使用
二、 map 的使用
三、 reduce 的使用
一、filter 内置类的使用
1、filter 是过滤的意思,它在 python2 的时候是内置函数,在 python3 被修改成内置类。
2、filter 需要两个参数一个是 function,是函数的意思,另一个参数是可迭代对象,有很多可迭代对象,举个例子,有一些数据,需要对这些数据进行过滤,筛选出年龄大于 18 岁的。
filter 可以给定两个参数,第一个参数是函数,第二个参数是可迭代对象,这个是这样理解的:可以根据函数对可迭代对象进行过滤。
ages =[12, 23, 30, 17, 16,22,19]
x=filter(lambda ele: ele > 18, ages)
运行结果是一个 filter 类型的对象。filter 结果是一个 filter 类型的对象,也是一个可迭代对象。
3、可迭代对象可以 for 循环
for a in x()
print(a)
打印一下 a,结果是 23、38、22、19 四个数据。根据这个规则来进行过滤的话,小于 18 岁的都不要了,只有大于18岁的才可以被拿到x里。用 filter 对数据进行过滤是很方便的,filter 就是把满足要求的给它拿进来,然后把不满足的给它过滤掉。
直接打印 x:print(x)就会告诉是什么类型的,这是一个对象,在讲面对对象是会介绍。可迭代对象可以用 for 循环,当然也可以不用 for 循环,直接用 list(x)把它转换成一个列表。
adult=list(x)
print(adult)
执行就会得到成年的数据23、30、22、19
4、过滤需要一个函数,函数面有一个布尔值,这个结果要返回的是个布尔值,告诉要以哪个条件来进行过滤,也是一个 lambda 表达式,也是一个匿名函数。
二、map 的使用
1、map 跟 filter 很像,也需要两个参数,一个叫函数,另一个叫可迭代对象。
ages =[12,23,30,17,16,22,19]
m = map(lambda ele : ele + 2,ages)
print(m)
运行结果也是一个可迭代对象,可以 list 一下把它变成列表
print(list(m))
运行得到一组数据 14、25、19、18、24、21
2、map 的作用就是把列表里每一个元素都执行一下函数里指定的行为,本来是 12 岁加两岁变成 14,23 加了 2 变成 25 等等,就是把每一个数据都加了 2。加减乘除都是可以的,map 用的不是很多。
三、reduce 的使用
1、reduce 以前是一个内置函数,但是后来给它变到一个模块里了,这个模块叫function.py。
内置函数和内置类都在 builtin.py 文件里,写 c 的就是内置类,写 f 的就是内置函数,有很多内置函数,f 是导入模块的语法。
2、reduce 需要两个参数,一个是 function,另一个是 sequence,sequence 就是一个序列,也可以当作一个列表,比如
scores =[100,89,76,87]
print(reduce(lamba ele1, ele2: ele1 + ele2, scores))
运行,它是一个折叠项,把这些数字都加起来 100+89+76+87,结果是 352, reduce 是求和的,这个算法就是先算前两个数的和,再加上第三个数以此类推。 reduce 这个函数是有一点难度的。
3、def foo(×,y):
return x+y
scores=[100,89,76,87]
print(reduce(foo,scores))
这个代码是不断地变化的一个过程,有点复杂,这里有四个数字,首先它会把 100给 x,把 89 给到 y,这两个数相加结果是 189,把这两个数加完之后,下一次再来调, x 不是 76 而是等于上两次相加的和, y 再等于下一个数 76。
下一次 189 加 76 的结果等于 265,所以 x 就等于 265, y 等于 87,下一次再来 265 再加 87,最后这个结果是 352。
4、知道这个原理后,再举个例子
students=[
{'name': 'zhangsan', 'age':18, 'score': 98, 'height':180},
{'name': 'lisi', age': 21, ‘score': 97, 'height':185},
{'name': 'jack', 'age': 22, 'score':100, 'height': 175},
{'name': 'tony', 'age':23, 'score': 90, 'height': 176},
{'name': 'henry', 'age': 20, ‘score': 95, 'height': 172}]
求所有学生的总年龄,reduce 是减项的意思。需要一个函数,所以就定义一个函数,需要两个变量,在 reduce 里传入 bar 和 students, 刚才说过,这个代码的过程是将这里的元素给到 x,然后算完这个结果之后再给到 y。
def bar(x, y):
return x['age'] + y['age']
reduce(bar, students)
运行一下,结果崩了, x={'name': 'zhangsan', 'age':18, 'score': 98, 'height':180}
,它是个字典,y={'name': 'lisi', age': 21, ‘score': 97, 'height':185}
,现在得到的这个结果是要 x 的 age 加上 y 的 age , x 的年龄是 18 ,y 的年龄是 21,相加 18+21=39,下一次是把这两个的和给到 x,x 等于39,下一次把算到的结果给到 x,但这是个问题,第一次 x 和 y 分别等于那个元素,但是下一次 x 就不再等于这个元素了而是等于上两个数据的和,第一次 x 是一个字典,y 也是个字典,但是下一次再加的时候 x 已经不是字典了,而是 18+21 的和 39,解决这个问题需要后面加一个零,再把 x 后的 age 去掉就行了
def bar(x, y):
return x + y['age']
print(reduce(bar, students, 0))
运行结果是 104,算一下总年龄就是 104,结果是对的。
把 0 变成 10,print(reduce( bar, students,10))
运行一下结果是 114,如果换成 20,结果变成 124 了。如果不指定初始值,x={'name': 'zhangsan', 'age':18, 'score': 98, 'height':180},y={'name': 'lisi', age': 21, ‘score': 97, 'height':185}
,指定初始值后 x 就等于 0,y 就等于第一个数据 18,下一次再重新把 x 置成 18,y 再等于下一个数据 21,一次次地加就能得到结果。
支持各种运算,一般情况下会求做加法的运算。乘是可以的,但是不管乘什么结果都是 0 ,因为初始值是 0,如果把初始值换成 1 结果就不是 0 了。
def bar(x, y):
return x * y['age']
print(reduce(bar, students, 0))
初始值只给 x,没有给 y,因为y要取一个个元素,y 是列表中的第一个字典。
5、print(reduce(bar, students, 0))
这个代码可以简化 lambda 表达式:
print(reduce(lambda x, y: x + y['age'], students, 0))
运行一下,这个是没有问题的。
这些东西都是很有用的,可以快速地操作一些数据。