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,