4. 生成器函数
什么是生成器
生成器是能够动态提供数据的可迭代对象。
特点:
现用现生成,节省内存。
python创建生成器的方式有三种:
- 生成器函数
- 生成器表达式
- 生成器类
生成器函数
什么是生成器函数
含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象。
生成器对象是一个可迭代对象。
yiled语句
作用
yield 语句仅在定义生成器函数的内部使用,使得此函数不再是普通函数,而是生成器函数。 生成器函数被调用将返回一个生成器对象。
语法
yield 表达式
# 或
yield from 表达式(此表达式必须返回一个可迭代对象或生成器)
生成器函数说明
- 生成器函数的调用将返回一个生成器对象,生成器对象是一个可迭代对象。
- 生成器对象使用 yield 语句逐步生成值,而不是一次性返回所有结果。
- 生成器函数在每次调用 yield 语句时暂停执行,并在下次请求值时从暂停处继续运行。
- 在生成器函数调用return会触发一个 StopIteration 异常(即生成数据结束)。
示例
# 生成器函数示例
def my_generator():
print('生成器函数开始:')
yield 1
yield 2
yield 5
print('生成器函数结束!')
generator_obj = my_generator() # generator_obj 绑定生成器对象
print(generator_obj)
for x in generator_obj:
print('x:', x)
上述函数 my_generator() 调用后,返回的是生成器对象,可以使用迭代器或 for 语句取值。
生成器函数调用,函数内部的语句并不会执行,只有向生成器对象创建的迭代器取值时,内部的语句才会递进运行,当遇到 yield 语句就会停止执行并将值返回 给next(it) 函数。下一次调用 next(it) 时在从上次的yield 语句处继续执行。
生成器函数执行完毕会引发 StopIteration 异常通知。
yield from 示例
# yield from 语句示例
def my_generator():
yield 1
yield from [2, 3, 4, 5]
yield 6
for x in my_generator():
print(x)