Python中的迭代器和生成器

来源:互联网 发布:韩国ins社交软件 编辑:程序博客网 时间:2024/05/22 04:32

Python中的迭代器是非常实用的,但是迭代器只能应用在类序列对象上,比如列表、元组和字典。除非生成迭代器的类,否则无法在非类序列对象上调用next()方法。

自己可以定义迭代器的类,只要满足:

1.      类定义中有next()方法

2.      类提供能返回迭代器实例的__iter__()方法

Code example:

class MyIterate(object):

def __init__(self,step):

          self.step = step

def next(self):

           if self.step<=0:

                    raise StopIteration

           self.step -= 1

           return self.step

def __iter__(self):

           return self

为使调用函数可以像类序列那样使用next()方法,python2.3引入生成器概念。生成器的定义是:带有yield语句的函数。一般的函数在一次调用过程中只会返回一次,但是yield语句的引入使得生成器对象(函数)能够暂停执行并返回中间结果;当next()方法再次被调用的时候,生成器会从中断的地方继续执行下去。

  下面结合代码讲解生成器的使用:

>>> def counter(start=0):

...    count = start

...    while True:

...             reset = (yield count)

...             if reset is not None:

...                     count = reset

...             else:

...                     count += 1

>>> count = counter(0)  #调用函数生成生成器对象,然后才能调用 next() 方法

>>> count.next()

0

>>> count.next()

1

>>> count.next()

2

>>> count.send(7)

7

>>> count.next()

8

>>> count.close()

>>> 

对于上面的代码,每次给 count 对象调用 next() 方法都会返回 count 的值;if 语句则判定是否需要重置 count 。如果没有调用 send 方法,(yield count) 的返回给 reset 的值为 None,从而 count 执行加一操作;如果调用 send 方法,则 (yield count) 的返回给 reset 的值为 send 方法的参数,从而完成重置操作。

         代码中的生成器一直在运行,最后调用 close 方法来使代码停止。

0 0
原创粉丝点击