包含 yield 语句的函数可以用来创建生成器对象,这样的函数也称为生成器函数。yield 语句与 return 语句的作用相似,都是用来从函数中返回值。return 语句一旦执行会立刻结束函数的运行,而每次执行到 yield 语句返回一个值之后会暂停或挂起后面代码的执行,下次通过生成器对象的 _ _ next _ _() 方法、内置函数 next()、for 循环遍历生成器对象元素或其他方式显示 “索要” 数据时恢复。生成器具有惰性求值的特点,适合大数据处理。
# 使用生成器来生成斐波那契数列
def func():
a, b = 1, 1 # 序列解包,同时为多个元素赋值
while True:
yield a # 暂停执行,需要时再产生一个新元素
a, b = b, a + b # 序列解包,继续生成新元素
g = func() # 创建生成器对象
for i in range(10): # 斐波那契数列中前10个元素
print(g.__next__(), end=' ')
print()
for i in func(): # 斐波那契数列中第一个大于100的元素
if i > 100:
print(i)
break
g = func() # 创建生成器对象
print(next(g)) # 使用内置函数 next() 获取生成器对象中的元素
print(next(g)) # 每次获取新元素时,由 yield 语句生成
print(g.__next__()) # 也可以调用生成器对象的 __next__() 方法
print(g.__next__())
def func():
yield from 'hello' # 使用yield表达式创建生成器
g = func()
print(next(g))
print(next(g))
for i in g: # 输出剩余元素
print(i, end=' ')
def func():
yield 1
yield 2
yield 3
x, y, z = func() # 生成器对象支持序列解包
print(x, y, z)
Python 标准库 itertools 提供了一个 count(start, step) 函数,用来连续不断地生成无穷个数,这些数中的第一个数是 start (默认为0),相邻两个数的差是step (默认为1)。
# 使用生成器模拟标准库 itertools 中的 count() 函数
def count(start, step):
s = start
while True: # 无穷循环
yield s # 返回一个数,暂停执行,等待下一次索要数据
s += step
x = count(3, 5)
for i in range(10):
print(next(x), end=' ')
print()
for i in range(10):
print(next(x), end=' ')