Python 教程之控制流(16)生成器

315 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

先决条件:Yield 关键字和迭代器讨论生成器时涉及两个术语。

发生器功能: 生成器函数的定义类似于普通函数,但每当它需要生成值时,它都会使用 yield 关键字而不是 return 来执行此操作。如果 def 的主体包含良率,则该函数将自动变为生成器函数。

# 第一次产生1次,第二次产生2次,第三次产生3次的发生器功能
def simpleGeneratorFun():
	yield 1		
	yield 2		
	yield 3		

# 用于检查上述生成器函数的驱动程序代码
for value in simpleGeneratorFun():
	print(value)

输出

1
2
3

生成器-对象 : 生成器函数返回生成器对象。生成器对象可以通过在生成器对象上调用 next 方法或在“for in”循环中使用生成器对象(如上面的程序所示)来使用。

# 一个 Python 程序,用于演示如何将生成器对象与 next() 结合使用

# 生成器功能
def simpleGeneratorFun():
	yield 1
	yield 2
	yield 3

# x 是生成器对象
x = simpleGeneratorFun()

# 使用 next 循环访问生成器对象
print(next(x)) # In Python 3, __next__()
print(next(x))
print(next(x))

输出

1
2
3

因此,生成器函数返回一个可迭代的生成器对象,即可用作迭代器。作为另一个例子,下面是斐波那契数列的生成器。

# 斐波那契数列的简单生成器
def fib(limit):
	
	# 初始化前两个斐波那契数列
	a, b = 0, 1

	# 一个接一个地产生下一个斐波那契数列
	while a < limit:
		yield a
		a, b = b, a + b

# 创建生成器对象
x = fib(5)

# 使用 next 循环访问生成器对象
print(next(x)) # In Python 3, __next__()
print(next(x))
print(next(x))
print(next(x))
print(next(x))

# 使用 for in 循环循环迭代生成器对象。
print("\nUsing for in loop")
for i in fib(5):
	print(i)

输出

0
1
1
2
3

Using for in loop
0
1
1
2
3

应用: 

假设我们创建了一个斐波那契数列流,采用生成器方法使其变得微不足道;我们只需要调用next(x)来获得下一个斐波那契数列,而不必费心于数字流的结束位置或时间。更实用的流处理类型是处理大型数据文件,如日志文件。生成器为此类数据处理提供了一种节省空间的方法,因为在一个给定的时间点仅处理文件的某些部分。我们也可以将迭代器用于这些目的,但是生成器提供了一种快速的方法(我们不需要编写__next__并在此处__iter__方法)。