python中几种常见的迭代器(人生苦短,我用python)
以下内容是我对python中几种常见的迭代器的理解,主要介绍了filter、map、reduce它们在python中的用法及案例。
一、filter
-
filter:在python 2中filter是一个方法,但是在python 3中,filter是一个类,它主要用于过滤序列中的一些元素和筛选元素
-
filter的使用方法:
filter(function, iterable):第一个参数是一个函数,第二参数是迭代对象,使用filter函数返回的结果为一个地址,我们需要通过迭代将地址中的元素取出来。
# 找出里表中比3大的数; # 方法一: ages = [1, 2, 3, 4, 5] res = [] for i in ages: if i > 3: res.append(i) print(res) # 运行结果:[4, 5]
# 方法二: ages = [1, 2, 3, 4, 5] res = filter(lambda x: x > 3, ages) print(res) #此时res中存的是filter返回的结果<filter object at 0x0000017786C37550> # len(res) 报错 迭代器返回的结果不能使用len求结果的长度 # 此时我们如果想要得到res中保存得内容,就必须通过迭代 # 01. 通过for循环 for i in res: print(i) # 02.直接用list转换 print(list(res)) # 注:lsit也是可迭代的
注意,当我们使用for循环将迭代器res中的内容取出来后,我们如果执行 print(list(res)),打印的结果为空,res中的内容已经被释放掉。
总结:通过filter类方法,我们可以对一个序列进行过滤和筛选
二、map
-
map类迭代器通常用于对一个序列进行相同的操作。比如,对序列同乘某个数或者,对列表内的网站进行统一修改时用map迭代器会非常的高效
-
map的使用方法:
map(function, iterable) 同样的,第一个参数是一个函数,第二个参数为迭代对象。
# 将列表中的元素同乘2 ages = [1, 2, 3, 4, 5] res = [] for i in ages: i *= 2 res.append(i) print(res) # 运行结果:[2, 4, 6, 8, 10] # 这个是常规方法,虽然能够达到最终的效果,但是不够简洁 # 下面是使用map迭代器实现的: res = map(lambda x: x*2 ,ages) print(res) # 如果直接打印res,我们可以发现,显示的是迭代器返回结果的地址:<map object at 0x0000013D42A87550> print(list(res)) # 运行结果:[2, 4, 6, 8, 10] # 同样都实现的目的,但是使用map更加简洁
三、reduce
-
reduce 在python 2是一个内置函数,在python 3版本中被整合到了functools中了。reduce的主要功能是为了压缩运算。
-
reduce的使用方法:
-
要使用reduce,我们必须要引入它所在的类文件,
from functools import reduce
-
reduce(function, iterable, init) 前两个参数与filter和map的参数使用方法相同,第三个参数是迭代初始值,这个是我们人为给定的,根据要求给出即可即可。
# 测试python是否为reduce的初始值设置默认值 res = [1, 1, 2, 3, 4, 5, 6] print(reduce(lambda x, y: x + y, res)) # 在这里我没有设置初始值 # 运行结果:22 # 说明reduce初始值得默认值为0
-
-
案例:求出下面字典math的和。
students = [ {'id': 1001, 'name': '周伟', 'sex': None, 'verbal': 90, 'math': 90, 'tel': '13512345670'}, {'id': 1002, 'name': '赵刚', 'sex': True, 'verbal': 56, 'math': 80, 'tel': '13512345678'}, {'id': 1003, 'name': '李强', 'sex': True, 'verbal': 48, 'math': 70, 'tel': '13512345680'}, {'id': 1004, 'name': '刘毅', 'sex': None, 'verbal': 92, 'math': 60, 'tel': '13512345688'}, {'id': 1005, 'name': '孙坚', 'sex': True, 'verbal': 85, 'math': 50, 'tel': '13512345698'}, {'id': 1006, 'name': '王小美', 'sex': False, 'verbal': 37, 'math': 40, 'tel': '13512345699'}, ]
def sums(x, y): return x+y["math"] print(reduce(sums, students, 0)) # 第三个参数表示x的初始值为0 # 运行结果:390 # 注意,这里的初始值要人为的设置,不然会报错 unsupported operand type(s) for +: 'dict' and 'int' print(reduce(lambda x, y: x+y["math"], students, 0))# 直接使用匿名函数 # 运行结果:390
常规方法就不展示了,大家可以自己去尝试一下。