python迭代器及高阶函数
每日一记
collections.abc # Iterator的模块 Iterator # 迭代器 Iterable # 可迭代对象 functools # 模块引入 reduce reduce # 高阶函数----> 做累计算 dir() # 获取当前类的所有成员 __closure__ # 获取闭包函数的使用变量 func().cell_contents # 获取func()的闭包函数 __iter__ # 判断是否是可迭代数据
1、迭代器
# 概念(可迭代对象不一定是迭代器一个迭代器就一定是一个可迭代对象) # 迭代取值的工具,重复上一次的结果而继续的过程 # 特征 # 不依赖索引,通过next指针迭代所有数据,一次取一个值,节省空间
1.1 定义
setvar = {1,2,3,4,5} res = iter(setvar) print(res)
1.2 判断
iter_var = iter({1,2,3,,4,5}) print("__iter__" in dir(iter_var) and "__next__" in dir(iter_var))
1.3 调用
""" next在调用迭代器中的数据时,是单向不可逆,一条路走到黑的过程 """ iter_var = iter({1,2,3,4,5}) print(next(iter_var)) print(next(iter_var)) # 调用2次,剩下3元素 # 没有元素则报错 -----> StopIteration 报错 停止迭代 for i in iter_var: print(i) # i 只能循环3次
1.4 重置
iter_var = iter({1,2,3,4,5}) # 重新赋值
1.5 collections 判断迭代器或可迭代对象
from collections import Iterator,Iterable setvar = {1,2,3,4,5} iter_var = iter(setvar) print(isinstance(iter_var,Iterator)) print(isinstance(setvar,Iterable))
2、高阶函数
# 能够把函数当成参数传递的就是高阶函数
2.1 map(func,Iterator)
""" 功能: 把iterable里面所有数据 一一的放进到func这个函数中进行操作 ,把结果扔进迭代器 参数: func 内置或自定义函数 iterable 具有可迭代性的数据 ([迭代器],[容器类型的数据],[range对象]) 返回值: 返回最后的迭代器 """ # 示例一 def func(n): dic = {97:"a",98:"b",99:"c"} dic_new = {} for k,v in dic.items(): dic_new[v] = k return dic_new[n] print(list(map(func,["a","b","c"])))
2.2 filter(func,Iterator)
""" 功能: 过滤数据 return True 当前这个数据保留 return False 当前这个数据舍弃 参数: func : 自定义函数 iterable : 可迭代型数据(容器类型数据,range对象,迭代器) 返回值: 迭代器 """ res = filter(lambda i : True if i % 2 == 0 else False , [1,2,3,4,5,6,7,8,9,10] ) print(res) res = filter(lambda x: type(x) == int ,[11,22,33,"zhou","04内置模块"]) print(res)
2.3 reduce(func,iterable)
""" 功能:累计算数据 先把iterable中的前两个值拿出来,扔到func当中做运算, 把计算的结果和iterable中的第三个元素在扔到func当中做运算, 再把结果算出来,和第四个元素做运算,以此类推 直到所有结果运算完毕.返回该结果 参数: func : 自定义函数 iterable : 可迭代型数据(容器类型数据,range对象,迭代器) 返回值: 计算之后的结果 """ # 示例一 (lst = [5,4,8,8] # => 整型5488) from functools import reduce print(reduce(lambda x,y: x*10 + y,[5,4,8,8])) # 示例二 # "789" => 789 禁止使用int强转 -> 数字 789 def func1(x,y): return x*10 + y def func2(n): dic = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9} return dic[n] # [7,8,9] print(reduce(func1,map(func2,"789") ))
2.4 sorted(iterable,key=func,reverse=False)
""" 功能:排序 参数: iterable:可迭代型数据(容器类型数据,range对象,迭代器) key :指定 自定义函数或 内置函数 reverse : 代表升序或者降序 , 默认是升序(从小到大排序) reverse=False 返回值: 排序后的list结果 """ # 示例一 lst = [1,2,3,4,5,-90,-4,-1,100] print(sorted(lst)) # 示例二 (从大到小) res = sorted(lst,reverse=True) print(res) # 示例三 (绝对值排序 abs) lst = [-10,-1,3,5] print(sorted(lst,key=abs)) # 示例四 (余数从大到小排序) def func(n): return n % 10 print(sorted(lst,key=func,reverse=True)) # 示例五(集合排序) setvar= {5,8,9,5,27,2} print(sorted(setvar)) # 示例六(字典排序) container = {"c":3,"a":1,"b":2} print(sorted(container)) # ['a', 'b', 'c'] 排 key