python实现迭代器,python中迭代器
Python迭代器和自定义迭代器一、可迭代对象
在Python中,可以使用for的循环语法.在.用于列表、元组、字符串等数据。并从中依次获取数据以供使用。我们称这个过程为遍历,也叫迭代。
在Python的基本数据类型中,列表、元组、字符串、字典都是迭代的,而整数、浮点数、布尔值都是不迭代的。
list_a中a的list_a=[1,2,3]:print(a,end= )tuple_b中b的tuple_b=(a , b , c ):print(b,end= )str_c中c的str _ c= AKQJ for c,End= )dict_d={BJ :北京, SH :上海, GZ :广州, SZ :深圳 } dict _ d中d的print(d,end= )运行结果:
1 3a b c a k q j bj sh gzsz Python中的一个对象,可以通过for之类的语句进行迭代.在.和读取一段数据供我们使用的对象称为可迭代对象。列表、元组、字符串和字典都是迭代对象。
可以使用isinstance()来确定一个对象是否是可迭代对象。
from collections . ABC import iterable print(is instance(list _ a,iterable))的运行结果:
false二、可迭代对象的本质
迭代可迭代对象的过程,其中每次迭代(即for.在.)将返回对象中的下一个数据,数据将被反向读取,直到所有数据都被迭代。
在这个过程中,我们需要知道每次访问的是哪一块数据,这样下一次迭代才会返回下一块数据,而不会跳过或者重复返回数据。Python帮我们实现了这个功能,就是迭代器(Iterator)。
迭代对象的本质是提供一个迭代器来帮助我们遍历它。那么Python是如何实现这些功能的呢?
在Python中,iterable对象通过_ _ iterator _ _方法为我们提供了一个迭代器。在迭代一个可迭代的对象时,我们实际上是先得到一个对象提供的迭代器,然后通过这个迭代器依次得到对象中的每一个数据。
iterable对象是带有_ _ iterator _ _方法的对象,iterable对象的迭代器是通过_ _ iterator _ _方法获得的。
三、iter()函数与next()函数
列表、元组、字符串、字典等。都是迭代器,我们可以通过iter()函数得到这些迭代器的迭代器。然后我们可以在迭代器上使用next()函数来获取下一个数据。
list_b=[ppp , yyy , ttt , hhh , ooo ,Nnn ]iterator _ b=iterator(list _ b)print(next(iterator _ b))print(next(iterator _ b))print(next(iterator _ b))print(next(iterator _ b))
pyytthhoonniter(iterable)函数取出iterable对象的迭代器,内部调用iterable对象的__iter__方法获取迭代器。
next(迭代器)函数通过迭代器获取下一个位置的值,内部调用迭代器对象的__next__方法获取下一个位置的值。
当我们迭代完最后一个数据后,再次调用next()函数会抛出StopIteration异常,告诉我们所有数据都被迭代了,所以我们不需要再次执行next()函数。
迭代循环的本质是通过iterator()函数获取iterable对象Iterable的迭代器,然后调用next()方法获取下一个值并赋给iter。当遇到StopIteration异常时,循环结束。
四、迭代器Iterator
通过上面的分析,我们已经知道迭代器是用来帮助我们记录每次迭代访问的位置的。当我们在迭代器上使用next()函数时,迭代器将返回它记录的下一个位置的数据。
使用next()函数时,调用迭代器对象的__next__方法。所以,如果我们想构造一个迭代器,我们必须实现它的__next__方法。
同时python要求迭代器本身是迭代的,所以我们要为迭代器实现_ _ iterator _ _方法,而_ _ iterator _ _方法返回一个迭代器。迭代器本身就是迭代器,所以迭代器的_ _ iterator _ _方法返回自身。
也就是说,实现__iter__方法和__next__方法的对象就是迭代器,迭代器本身就是可迭代对象。
五、自定义迭代器
迭代器的核心功能是可以通过调用next()函数返回下一个数据值。
如果每次返回的数据值不在已有的数据集中,而是通过程序按照一定的规则计算生成的,那么就不需要依赖已有的数据集,也就是说不需要一次性缓存所有要迭代的数据,可以节省大量的存储(内存)空间。
ClassFeiiboiterator(object): Fibonacci序列迭代器 def __init__(self,N):# Fibonacci序列值的个数self.n=n #记录下标self . index=0 # Fibonacci序列self前面的两个值。num1=0self。num 2=1 def _ _ next _ _(self): is next()调用该函数以获取下一个数字 if self . index self . n:num=self . num 1 self . num 1,self.num2=self.num2,self . num 1 self . num 2 self . index=1 return num else:raise stop iteration def _ _ ITER _ _(self): 迭代器的__iter__ returns本身 return self _ if _ _ name _ _= _ main _ _ :FB=feiboioperator(20)for num in FB:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181在上面的代码中,我们自定义了一个类,它实现了__next__和__iter__方法。__next__方法返回的值是我们计算的结果,所以我们总是可以使用next()。
当我们通过for遍历Fibonacci序列中的前n个数字时.在.循环,我们会在第n次调用next()的时候抛出StopIteration异常,然后结束for循环,和Python迭代器的作用一样。
因此,我们已经实现了自定义迭代器。
历史提交的图片或压缩文件
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。