python中的迭代器和生成器

来源:互联网 发布:贝叶斯学派全知理论 编辑:程序博客网 时间:2024/06/05 23:42

迭代是访问如列表,元组,字典,字符串等对象中的元素的一种方式迭代器是⼀个可以记住遍历的位置的对象。迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器
In [24]: dir(list)
Out[24]:
[‘add‘, ‘class‘, ‘contains‘, ‘delattr‘,
delitem‘, ‘dir‘, ‘doc‘, ‘eq‘, ‘format‘,
ge‘, ‘getattribute‘, ‘getitem‘, ‘gt‘,
hash‘, ‘iadd‘, ‘imul‘, ‘init‘, ‘iter‘,
le‘, ‘len‘, ‘lt‘, ‘mul‘, ‘ne‘, ‘new‘,
reduce‘, ‘reduce_ex‘, ‘repr‘, ‘reversed‘,
rmul‘, ‘setattr‘, ‘setitem‘, ‘sizeof‘,
str‘, ‘subclasshook‘, ‘append’, ‘clear’, ‘copy’,
‘count’, ‘extend’, ‘index’, ‘insert’, ‘pop’, ‘remove’,
‘reverse’, ‘sort’]
上面是一个列表的所有属性,其中有一个_iter_方法,⼀个具备了 iter ⽅法的对象,就是⼀个可迭代对象。字典,元组,字符串都是可迭代对象,可迭代对象通过 iter ⽅法向我们提供⼀个迭代器,我们在迭代⼀个可迭代对象的时候,实际上就是先获取该对象提供的⼀个迭代器,然后通过这个迭代器来依次获取对象中的每⼀个数据。

  1. In [29]: li = iter(a)

    In [30]: type(li)
    Out[30]: list_iterator

    In [31]: dir(li) Out[31]: [‘class‘, ‘delattr‘, ‘dir‘,
    doc‘, ‘eq‘, ‘format‘, ‘ge‘, ‘getattribute‘,
    gt‘, ‘hash‘, ‘init‘, ‘iter‘, ‘le‘,
    length_hint‘, ‘lt‘, ‘ne‘, ‘new‘, ‘next‘,
    reduce‘, ‘reduce_ex‘, ‘repr‘, ‘setattr‘,
    setstate‘, ‘sizeof‘, ‘str‘, ‘subclasshook‘]
    li是可迭代对象,通过iter()函数获得列表的迭代器,其中有_next_方法,通过这个方法就可以不断获取列表中的下一个元素
    In [35]: a = [1,2,3,4,5,6]

In [36]: li = iter(a)

In [37]: next(li)
Out[37]: 1

In [38]: next(li)
Out[38]: 2

In [39]: next(li)
Out[39]: 3

In [40]: next(li)
Out[40]: 4

In [41]: next(li)
Out[41]: 5

In [42]: next(li)
Out[42]: 6
所以一个具备了_iter_方法和_next_方法的对象就是一个迭代器,所以如果需要写一个迭代器,需要具备这两个方法才能构成迭代器。从中就可以看出for循环的本质:通过iter()函数得到可迭代对象的迭代器,然后不断调用next()方法来取得下一个值,当遇到异常时,循环结束。

生成器
如果我们需要自定义一个迭代器,自己定义一个迭代器较为麻烦,所以有一种较为简单的语法即生成器,生成器是一种特殊的迭代器
生成器的创建方法有以下几种
1 只要把⼀个列表⽣成式的 [ ] 改成 ( )
In [15]: L = [ x*2 for x in range(5)]
In [16]: L
Out[16]: [0, 2, 4, 6, 8]
In [17]: G = ( x*2 for x in range(5))
In [18]: G
Out[18]: