Python迭代器和生成器

迭代器:

  迭代的意思是重复做一些事很多次——就像循环一样。我们经常在for循环中对列表或字典进行迭代,但事实上也能对其它对象进行迭代,只要该对象实现了__iter__方法。__iter__方法返回一个迭代器(iterator),迭代器就是具有next方法(该方法在调用时不需要任何参数)的对象。在调用next方法时,迭代器会返回它的下一个值。如果next方法被调用,但迭代器没有值可以返回,则会引发一个StopIteration异常。更精确的说,一个实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象则是迭代器

  说到这,那我们为什么要使用迭代器?因为迭代器更通用、更简单、更优雅。举个例子,创建一个迭代器,每次返回的数都在原基础上加2:

class add():
    def __init__(self):
        self.a = 0
        self.b = 2
    # python3中迭代器对象应该实现__next__方法,而不是next方法,而新的内建函数next可以用于访问这个方法。
    # 换句话说,next(it)等同于python2中的it.next()。
    def __next__(self):
        self.a = self.a + self.b
        return self.a
    def __iter__(self):
        return self

  这里需要注意的是,迭代器实现了__iter__方法,这个方法实际上返回迭代器本身,这样操作,程序就能返回所需的迭代器,就能直接在for循环中使用迭代其本身了。请看下述例子:

#创建一个add对象,可以在for循环中使用该对象
Add = add()
for i in Add:
    if i > 2000:
        print(i)
        break

#输出结果:
2002

   迭代器有两个重要方法:iter() 和 next(),内建函数iter可以从可迭代对象中获取迭代器,next函数可以获取它返回的下一个值。举个例子:

list = [1,2,3,4,5]
it = iter(list)
while True:
    try:
        print(next(it))  #或者 it.__next__()
    except Exception as e:
        break

生成器:

  任何包含yield语句的函数称为生成器,跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象。举个例子:

import sys

def fibonacci(n): #生成器函数 - 斐波那契
    a,b,no = 0,1,0
    while True:
        if (no > n):
            return
        yield a
        a,b = b,a+b
        no += 1

f = fibonacci(20) # f是一个迭代器,由生成器返回生成

while True:
    try:
        print(next(f),end=",")
    except StopIteration:
        sys.exit()

#运行结果:
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,

 

  

posted @ 2018-07-13 13:30  Buscar  阅读(192)  评论(0编辑  收藏  举报