📅  最后修改于: 2020-01-18 14:47:21             🧑  作者: Mango
先决条件: 迭代器
我们讨论生成器时涉及两个术语。
# 一个使用yield的生成器函数
def simpleGeneratorFun():
yield 1
yield 2
yield 3
# 测试代码
for value in simpleGeneratorFun():
print(value)
输出:
1
2
3
2, Generator-Object:生成器函数返回生成器对象。可以通过在生成器对象上调用next方法或在“ for in”循环中使用生成器对象(如上述程序所示)。
# Python程序,展示对生成器对象使用next()方法
# 一个生成器函数
def simpleGeneratorFun():
yield 1
yield 2
yield 3
# x是一个生成器对象
x = simpleGeneratorFun()
# 生成器对象迭代,使用next
print(x.next()); # In Python 3, __next__()
print(x.next());
print(x.next());
输出:
1
2
3
因此,生成器函数返回可迭代的生成器对象,即可以用作Iterators。
作为另一个示例,下面是斐波那契数的生成器。
# 一个生成器,用来生成斐波那契数
def fib(limit):
# 初始化两个斐波那契数
a, b = 0, 1
# 通过yield一个个地生成斐波那契数
while a < limit:
yield a
a, b = b, a + b
# 创建一个生成器对象
x = fib(5)
# 对生成器对象进行迭代,使用next方法
print(x.next()); # 若在Python 3, 需要使用__next__()
print(x.next());
print(x.next());
print(x.next());
print(x.next());
# 使用for循环对生成器迭代
print("\n使用for循环对生成器迭代")
for i in fib(5):
print(i)
输出:
0
1
1
2
3
使用for循环对生成器迭代
1
1
2
3
应用程序:假设我们创建一个斐波纳契数流,采用生成器方法使其变得简单明了;我们只需要调用next(x)即可获得下一个斐波那契数,而不必担心数字流在何处或何时结束。
流处理的一种更实用的类型是处理大型数据文件,例如日志文件。生成器为此类数据处理提供了一种节省空间的方法,因为在一个给定的时间点仅处理文件的一部分。我们也可以将迭代器Iterators用于这些目的,但是生成器Generator提供了一种快速的方法(我们不需要在这里编写__next__和__iter__方法)。