Generator函数是一种特殊类型的函数,它可以生成迭代器对象。与普通函数不同的是,当调用一个Generator函数时,并不会立即执行函数体内的代码,而是返回一个迭代器对象。通过调用迭代器对象的next()
方法可以依次执行Generator函数的代码,并在每次执行时返回一个值。
生成器函数使用yield
关键字来定义生成器的返回值,每次调用yield
语句时,生成器函数会产生一个值,并在此处暂停执行,等待下一次调用next()
方法继续执行。
迭代协议是一种约定,规定了一个对象必须具有一个__iter__()
方法,该方法返回一个迭代器对象。迭代器对象必须具有一个__next__()
方法,在每次调用next()
方法时,返回下一个值。当迭代器对象没有更多的值可供返回时,它应该抛出一个StopIteration
异常,以通知调用者迭代已经结束。
Generator函数实现了迭代协议,因此生成的迭代器对象可以通过for
循环或者显式调用next()
方法来逐个获取生成器函数产生的值。在每次调用next()
方法时,Generator函数会从上次暂停的位置继续执行,直到遇到下一个yield
语句或者函数结束。
以下是一个使用Generator函数生成斐波那契数列的例子:
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
fib = fibonacci()
for i in fib:
if i > 1000:
break
print(i)
这个Generator函数定义了一个无限循环,每次调用yield
语句时,产生斐波那契数列中的下一个值。通过for
循环遍历生成的迭代器对象,可以不断获取斐波那契数列中的值,直到某个值大于1000时,结束循环。