Python中的iterable和iterator

Posted geeklove

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中的iterable和iterator相关的知识,希望对你有一定的参考价值。

参照官方文档:

1 iterable是一个能返回它的成员的对象。包括sequence types(list,str,tuple) and not-sequence types(dict, file objects), objects and classed defined with an __iter__() method or a __getitem__() method 

当一个iterable object传入 iter()方法(同样是调用__iter__()方法的时候)的时候,会返回一个iterator. 这是显式创建iterator的方法。当我们用for遍历的时候,iterator会自动创建iterator

2 iterator应该定义一个__iter__()方法(或者一个供迭代的生成器),由于有这个方法都是iterable的,所以iterator都是iterable的

iterator的__iter__()方法返回的是iterator object itself

为什么iterator都是iterable的?因为iterator(比如list)都是可以重复遍历的(想象并发情况下),所以需要每次__iter__()的时候返回一个独立的迭代器。

如果iterator不是iterable的,那么每次调用都只返回同一个iterator,一旦这个iterator到达了StopIteration的条件,就完了

注:用for遍历对象的时候,如果对象没有__iter__,但是实现了__getitem__,会使用下标迭代的方式

      iter也是一样,当__iter__方法没有的时候,返回一个用下标迭代的可迭代对象来代替,比如str 

可以用一个例子来解释这一切:

class B(object):
    def __init__(self):
        pass

def next(self): yield in B next class A(object): def __init__(self): self.b = B() def next(self): print in A next def __iter__(self): return self.b a = A() for a_next in a: # 迭代的时候,a_next指向的是 B.next for a_next_value in a_next: # 使用for遍历生成器B.next,由于B.next是无状态的,所以可以一直死循环yield print a_next_value

可以把B.next中的内容改写成return ‘in B next‘,将A.__iter__改为yield ‘in A iter‘, return ‘in A iter‘,甚至在B中再定义一个生成器函数在A.__iter__中返回来查看效果



以上是关于Python中的iterable和iterator的主要内容,如果未能解决你的问题,请参考以下文章

Python中的iterable该怎么理解

python中的iterable是啥意思

Python中的next()iter()函数详解

Python中的iterable该怎么理解

python中的next()以及iter()函数

Python中的迭代器与可迭代:iter()和next()