python之迭代器与生成器详解

 迭代器是设计模式中的一种行为模式,它提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。python提倡使用生成器,生成器也是迭代器的一种。

python可迭代对象和迭代器

要点:

  • 迭代即遍历,那么可迭代对象顾名思义就是可以遍历的数据类型或结构,表现在python中就是支持for循环遍历的对象。

  • python中有Iterable类代表可迭代对象,所有的可迭代对象都属于这个类;Iterator类表示迭代器,所有的迭代器对象都属于这个类;

  • 可迭代对象为什么可迭代?因为可迭代对象的内部实现了迭代器这种行为模式,其在python中的表现就是__iter__魔法方法。也就是说所有python内建的数据结构如str、list等预先已在定义结构时使用__iter__方法实现了迭代器.

可迭代对象和迭代器的原理

根据上面的要点我们自定义可迭代对象:

from collections import Iterable  class MyIterable(object):      def __iter__(self):         pass  my_iter = MyIteradle()  print(isinstance(my_iter,Iterable))  # 结果: True

说明python解释器是通过判断一个对象是否有__iter__魔法方法来确定是否是可迭代对象。现在我们尝试用for...in...遍历一下我们定义的可迭代对象:

my_iter = MyIter() for i in my_iter:     print(i)  结果: TypeError: iter() returned non-iterator of type 'NoneType'

报错了,为什么?我们需要知道for...in...干了什么事:

python解释器遇到for...in关键字时,第一步找到in后面的my_iter对象,寻找内部的__iter__魔法方法,如果有就执行这个方法,该方法会生成一个迭代器;

第二步从迭代器中取出一个值,并将这个值赋值给i.

那么清楚了,上述我们虽然有了__iter__魔法方法,但是它并不会返回一个迭代器,从迭代器中取值这个动作也没有。那么我们需要实现一个迭代器。

为了便于理解,我们把可迭代对象想象成一个容器,里面存放了我们的数据;迭代器想象成以可迭代对象为原型,在上面加装了一种方法可以顺序访问一个可迭代对象中各个元素,for循环干的事就是获取这个迭代器并从迭代器中取数据。

记住:可迭代对象和它的迭代器是两个不同的对象。

如此我们可知,既然迭代器的原型是可迭代对象,那么自然也要有__iter__魔法方法了,可是这个方法要求返回一个迭代器,那么不无限循环了吗?我们可以让其返回它自己就可以了。另外要加一个方法实现从迭代器中取数据啊,python解释器规定这个方法为_next_.

from collections import Iterable, Iterator class MyIterator(object):      def __iter__(self):         return self      def __next__(self):         return 0 my_iterator = MyIterator() print(isinstance(my_iterator, Iterator)) for i in my_iterator:     print(i)  # 结果: True

没有报错,由此我们可知在python中实现了__iter__和__next__方法的对象就是迭代器。

完成了吗?并没有,看迭代器定义:提供一种方法顺序访问一个聚合对象中各个元素;顺序访问,由此有:

class MyIterator(object):      def __init__(self, mylist):         self.mylist = mylist         # current用来记录当前访问到的位置         self.current = 0      def __next__(self):         if self.current < len(self.mylist):             item = self.mylist[self.current]             self.current += 1             return item         else:             raise StopIteration      
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信