迭代器
1.迭代器的定义: 能被next调用,并不断返回下一个值的对象,叫做迭代器(对象)
2.迭代器的概念:
迭代器指的是迭代取值的工具,迭代是一个重复的过程,
每次重复都是基于上一次的结果而继续的,
单纯的重复并不是迭代
3.迭代器的特征: 并不依赖索引,而通过next指针迭代所有数据,一次只取一个值,大大节省空间
4.dir: 获取当前类型对象中的所有成员
其中,里面有一个魔术方法,叫做__iter__方法,
__iter__方法用来判断是否是可迭代性数据
setvar = {"a",bcd"}lst = dir(setvar) # 获取setvar对象中的所有成员print(lst)'''['__and__','__class__','__contains__','__delattr__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__iand__','__init__','__init_subclass__','__ior__','__isub__','__iter__','__ixor__','__le__','__len__','__lt__','__ne__','__new__','__or__','__rand__','__reduce__','__reduce_ex__','__repr__','__ror__','__rsub__','__rxor__','__setattr__','__sizeof__','__str__','__sub__','__subclasshook__','__xor__','add','clear','copy','difference','difference_update','discard','intersection','intersection_update','isdisjoint','issubset','issuperset','pop','remove','symmetric_difference','symmetric_difference_update','union','update']'''
5.关于迭代器,需要注意的点:
for 循环能够遍历一切可迭代性数据的原因在于,1)">底层调用了迭代器,通过next方法中的指针实现数据的获取
可迭代对象(不能够被next直接调用) -> 迭代器(可以被next直接调用的过程)
一个可迭代对象不一定是迭代器
一个迭代器就一定是一个可迭代对象
6.定义一个迭代器
定义迭代器需要使用iter()方法
setvar = {}it = iter(setvar) 将可迭代对象setvar变成了迭代器print(it) <set_iterator object at 0x000002142D1108B8>
7.判断一个迭代器
迭代器必须要有__iter__方法和__next__方法
res = __iter__" in dir(it) and __next__in dir(it)print(res) True
8.调用迭代器
next在调用迭代器中的数据时,是单向不可逆,一条路走到黑的过程
当没有可迭代的数据后,抛出一个stopiteration的异常,并且停止迭代
setvar = { 将可迭代对象setvar变成了迭代器res = next(it) cres = dres = ares = bres = 当没有可迭代的数据后,抛出一个stopiteration的异常,并且停止迭代
9.重置迭代器
重置迭代器,只需要再次调用iter()方法即可
it = iter(setvar) 重置迭代器res =print(res)
10.使用其他方式判断是否是可迭代对象/迭代器
"""Iterator 迭代器 Iterable 可迭代对象"""from collections import Iterator,Iterableit = iter(setvar)res = isinstance(it,Iterator)(res)res =print(res)
11.除了next(),也可以使用以下两种方式调用迭代器中的数据
1. for 循环print(<=>)for i it: (i) 2. for + next)lst = [1,2,3,4,5,6,7,8,9,10]it = iter(lst)in range(10): res = next(it) (res)(next(it))print(next(it))
高阶函数
高阶函数的定义:能够把函数当成参数传递的就是高阶函数
常用的四大高阶函数:map filter reduce sorted
1.map
map(func,Iterable)
功能:处理数据
把Iterable中的数据一个一个拿出来,扔到func函数中做处理
把处理之后的结果放到迭代器当中,最后返回迭代器
参数:
func : 自定义函数 或 内置函数
Iterable : 可迭代性数据(容器类型数据 range对象 迭代器)
返回值:
迭代器
示例1:将["1","2","3","4"]转化成[1,4]
常规写法:
lst = [1234] 常规写法lst_new = [] lst: lst_new.append(int(i))print(lst_new)
用map改造的写法:
map改造it = map(int,lst) it是一个map对象print(List(it)) [1,4]
map(int,lst)的实现过程:
首先把"1" 扔到int当中做处理,将强转后的结果扔到迭代器中
然后把"2" 扔到int当中做处理,将强转后的结果扔到迭代器中
然后把"3" 扔到int当中做处理,将强转后的结果扔到迭代器中
然后把"4" 扔到int当中做处理,将强转后的结果扔到迭代器中
最终返回迭代器
获取迭代器中的数据的方法:1.next() 2.for循环遍历 3.for+next 4.List(it)强转
示例2:[1,4] => [2,24,64]
map改造参数和返回值return一定要写'''def func(n): return n << n lst = [1,4] it = map(func,lst)(List(it)) lambda + map it = map(lambda n : n << n,1)">print(List(it))
示例3:dic = {97:"a",98:"b",99:"c"} # ["a","b","c"] => ascii [97,98,99]
map改造 原字典 dic = {97:} 新字典 dic_new = {} 遍历原字典 for k,v dic.items(): 更换键值对 dic_new[v] = k print(dic_new) {'a': 97,'b': 98,'c': 99} 通过键来获取值 return dic_new[n] lst = [print(List(it))
2.filter
filter(func,iterable)
功能: 过滤数据
return True 当前这个数据保留
return False 当前这个数据舍弃
参数:
func : 自定义函数
iterable : 可迭代型数据(容器类型数据,range对象,迭代器)
返回值:
迭代器
lst = [1,1)">] lst: if i % 2 == 0: lst_new.append(i) (lst_new) filter改写 func(i): 0: True else: Falseit = filter(func,lst) filter + lambda 改写it = filter(lambda i : True if i % 2 == 0 False,lst )print(List(it))
3.reduce
reduce(func,iterable)
功能:计算数据
先把iterable中的前两个值拿出来,扔到func当中做运算,
把计算的结果和iterable中的第三个元素在扔到func当中做运算,
再把结果算出来,和第四个元素做运算,以此类推
直到所有结果运算完毕.返回该结果
参数:
func : 自定义函数
iterable : 可迭代型数据(容器类型数据,迭代器)
返回值:
计算之后的结果
示例1:lst = [5,8] => 整型5488
常规写法1:
strvar = "" lst: strvar += str(i)(strvar,type(strvar))res = int(strvar)print(res,type(res))
常规写法2:
print(isinstance(it,Iterator)) Truenum1 = next(it) 5num2 = next(it) 4num = num1 * 10 + num2 54 it: num = num * 10 + i 54*10+8=548 548*10+8=5488print(num,type(num)) 5488 <class 'int'>
reduce改造:
func(x,y): return x*10 + ylst = [5,1)">]res = reduce(func,type(res))
reduce(func,lst)实现的过程:
先拿出5和4两个元素,扔到func当中做运算,结果是54
在拿54和8两个元素,结果548
在拿548和8两个元素,结果5488
返回最终的结果: 5488 程序结束
reduce+lambda:
res = reduce(lambda x,y:x*10+y,1)">print(res)
示例2:"789"=>789 禁止使用int强制转换
func1(x,1)"> y func2(n): dic = {0":0,1)">":1,1)">":2,1)">":3,1)">":4,1)">5":5,1)">6":6,1)">7":7,1)">8":8,1)">9":9 dic[n]it = map(func2,1)">789") [7,9]res = reduce(func1,it)4.sortedsorted(iterable,key=函数,reverse=False)
功能:排序
参数:
iterable:可迭代型数据(容器类型数据,迭代器)
key :指定自定义函数或内置函数
reverse :代表升序或者降序,默认是升序(从小到大排序) reverse=False
返回值:
排序后的结果1.默认是从小到大排序lst = [1,-90,-4,-1,100 sorted(lst) 2.reverse 从大到小排序res = sorted(lst,reverse=True) 3.指定函数进行排序# 按照绝对值排序 abslst = [-10,5]res = sorted(lst,key=abs) 4.使用自定义函数进行排序lst = [19,21,38,43,55return n % 10lst = sorted(lst,1)">func)print(lst)sort和sorted的区别:
(1) sorted可以排序一切容器类型数据, sort只能排列表
(2) sorted返回的是新列表,sort是基于原有的列表进行修改
(3) 推荐使用sorted总结
以上是内存溢出为你收集整理的day13:迭代器&高阶函数(map,reduce,filter,sorted)全部内容,希望文章能够帮你解决day13:迭代器&高阶函数(map,reduce,filter,sorted)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)