首页 > 代码库 > python之迭代器、生成器、可迭代对象

python之迭代器、生成器、可迭代对象

迭代器 iterator

迭代,即一些事要重复好多次,就像在循环中做的那样。

    一个对象是否可迭代,全都取决于这个对象是否有__iter__方法,只要该对象实现了__iter__方法,调用对象的__iter__方法,就回返回一个迭代器,这个迭代器一定具有next方法(调用这个方法时不需要任何参数),在调用这个迭代器的next方法时,迭代器就回返回它的下一个值,当迭代器中没有值可以返回了,就回抛出一个名为StopIteration的异常,停止迭代。

准确的说,一个实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象则是迭代器。

每次调用next()方法的时候会做两件事:

  1、为下一次调用next()方法修改状态

  2、为当前这次调用生成返回结果

特性:不可逆,只能前进,不能后退。只能不断通过next()函数获取下一个数据,有需要的时候才生成值返回,没调用的时候就处于休眠状态等待下一次调用。

for循环就是这样工作的,for循环在循环一个对象的时候,会调用这个对象的__iter__方法,得到迭代器,然后在调用这个迭代器的next方法,去获得这个迭代器中包涵的每个值。

要判断一个对象是否为iterator对象。方法如下:

from collections import Iterator

isinstance((x for x in range(9)),Iterator)

迭代器与列表的区别

  迭代器的工作方式,一个接着一个的获取值。例如有个函数可以一个接一个的计算值,在使用时计算一个值时获取一个值。

  列表,一次性获取所有的值。如果有很多值,列表就会占用太多的内存。

例:

class test_class:

    def __init__(self,start_num,stop_num):

        self.start_num = start_num

        self.stop_num = stop_num

    def next(self):

        if self.start_num <  self.stop_num:

            self.start_num += 1

        return self.start_num

    def __iter__(self):

        return self

test_obj = test_class(0,3)

print test_obj.next()

>>>1

print test_obj.next()

>>>2

print test_obj.next()

>>>3



生成器

一种特殊的迭代器。(用普通函数语法定义的迭代器)

可以作用于for循环,也可以被next()函数不断调用并返回下一个值,只到最后抛出stopiteration错误表示无法继续返回下一个值。



可迭代对象 iterable

可直接作用于for循环的对象统称为可迭代对象。

有 list、 dict、tuple、set、str等数据类型,还有 generator(包括生成器和带yield的generator function)。

要判断一个对象是否为iterable对象。方法如下:

from collections import Iterable

isinstance([],Iterable)



总结:

可用于for循环的对象都是iterable类型,

可用于next()函数的对象都是iterator类型,


生成器都是iterator对象,但list、dict、str等虽然是iterable,却不是iterator。

可以使用iter()函数可以把list等iterable变成iterator。


本文出自 “墨” 博客,请务必保留此出处http://jinyudong.blog.51cto.com/10990408/1949647

python之迭代器、生成器、可迭代对象