迭代器和高阶函数
一. 迭代器
1. 什么是迭代器
能被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator 迭代器是对象)
2. 概念
迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是局域上一次的结果而继续的,单纯的重复并不是迭代
3. 特征
并不依赖索引,而通过next指针(内存地址寻址)迭代所有数据,一次只取一个值,
而不是一股脑的把所有数据放进内存,大大节省空间
4. 可迭代性对象
"""如果一个对象中含有__iter__这个成员,说明该数据是可迭代性对象"""
setvar = {"白金鸽","杨特","郝建康"} # 查看该对象中的成员,dir lst = dir(setvar) if '__iter__' in lst: print("该数据是可迭代性数据") print(lst)
5. 迭代器
'''
for循环遍历时,底层利用迭代器,先把该数据变成迭代器,通过next地址next地址寻址的方式,找到该数据
如果是迭代器,一定是可迭代器
如果是可迭代对象,不一定是迭代器
'''
1.如何变成一个迭代器
# it = iter(setvar) it = setvar.__iter__() lst = dir(it) print(lst)
2.如何判断一个迭代器 __iter__ + __next__
if "__iter__" in lst and "__next__" in lst: print("该数据是迭代器")
3.如何调用一个迭代器
"""next调用时,是单向不可逆的过程,一条路走到黑"""
# 方法一 res = next(it) print(res) res = next(it) print(res) res = next(it) print(res) # res = next(it) error # print(res)
4.重置迭代器
it = iter(setvar) # res = next(it) res = it.__next__() print(res) # 方法二 print("<=========>") for i in it: print(i) # next(it) error 单项不可逆的过程 # 方法三 print("<=========>") setvar = {"白金鸽","杨特","郝建康","于盛林","杨业","王娟娟","草配线","孟凡伟"} it = iter(setvar) # setvar.__iter__() for i in range(8): print(next(it))
5.可以使用Iterator ,Iterable 来判断是否是迭代器或者可迭代对象
from collections import Iterator , Iterable res = isinstance(it,Iterator) # True res = isinstance(it,Iterable) # True res = isinstance(setvar,Iterator) # False res = isinstance(setvar,Iterable) # True print(res)
二 高阶函数 --- map
map(func,Iterable): 处理数据
功能:
把Iterable中的数据一个一个的传递到func函数当中处理,处理之后的结果通过迭代器一个一个获取
参数:
func: 内置或者自定义函数
Itreable: 可迭代性数据(容器类型数据 range对象 迭代器)
返回值:
迭代器
单纯的调用map函数,不能立刻执行;
通过调用迭代器,才能执行map中的函数体;
调用一次迭代器,就运行一次map函数
注意点 : 参数和返回值必不可少
# (1) ["1","2","3","4"] => [1,2,3,4] lst = ["1","2","3","4"] lst_new = [] for i in lst: # print(int(i)) lst_new.append(int(i)) print(lst_new) 改写: it = map(int,lst) for i in it: print(i,type(i)) print(list(it))
小练习:
有个字典 dic = { 97 : "a" , 98 : "b" , 99 : 'c'} ,给与['a','b','c'] 返回 [97,98,99] # 方法一 lst1 = [] for k,v in dic.items(): if v in lst: lst1.append(k) print(lst1) def func(n): for k,v in dic.items(): dic_new[v] = k return dic_new[n] it = map(func,lst) print(next(it)) print(next(it))
三高阶函数 --- reduce
reduce(func,Iterable): 计算数据
功能:
先把Iterable中的前两个数据拿出来,扔到func中做处理,得到一个结果,
在拿当前结果和Iterable的下一个值在继续扔到func做计算
以此类推
直到最后返回结果
参数:
func: 自定义函数
Iterable: 可迭代性对象(容器类型数据,range对象,迭代器)
返回值:
计算最后的结果
小练习:
# (1) [5,4,8,8] => 5488
普通 lst = [5,4,8,8] strvar = '' for i in lst: strvar += str(i) res = int(strvar) print(res , type(res) ) # 使用reduce进行改造 from functools import reduce def func(x,y): return x *10 + y lst = [5,4,8,8] res = reduce(func,lst) print(res',type(res)) # lambda 改造 print(reduce( lambda x,y : x*10 + y , lst))
lst = [1,12,435,234,122,2] => 过滤掉偶数,保留奇数
lst = [1,12,435,234,122,2] lst_new = [] for i in lst: if i % 2 == 1: lst_new.append(i) print(lst_new) # 使用filter进行改造 def func(n): if n % 2 == 1: return True else: return False it = filter(func,lst) lst = list(it) print(lst)
# 使用lambda 进行改造
print(list(filter( lambda n : True if n % 2 == 1 else False , lst )))
三高阶函数 --- sorted
sorted(Iterable,reverse=False,key=函数) 功能: 排序数据 参数: Iterable : 可迭代对象(容器类型数据 range对象 迭代器) reverse : 正序或者倒叙 reverse = False (从小到大) key : 内置或者自定义方法 返回值: 排序后的数据(列表)
1.从小到大
lst = [-9,18,13,16,99,87] res = sorted(lst) print(res)
2.从大到小
res = sorted(lst,reverse=True) print(res)
3.按照绝对值,内置函数进行排序
lst = [-99,-9,-100,1] # print(sorted(lst)) res = sorted(lst,key=abs)
"""
sort 和 sorted的区别:
[sorted] 推荐
1.sorted 可以对所有的容器类型数据排序
2.返回一个新的列表
[sort]
1.sort 只能对列表这一个类型进行排序
2.针对于原有的列表进行排序
"""