欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python迭代器和生成器

程序员文章站 2022-04-24 10:03:51
迭代器: 迭代的意思是重复做一些事很多次——就像循环一样。我们经常在for循环中对列表或字典进行迭代,但事实上也能对其它对象进行迭代,只要该对象实现了__iter__方法。__iter__方法返回一个迭代器(iterator),迭代器就是具有next方法(该方法在调用时不需要任何参数)的对象。在调用 ......

迭代器:

  迭代的意思是重复做一些事很多次——就像循环一样。我们经常在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,