在 Python 中,使用了 yield 关键字的函数被称为生成器函数,其中,yield 关键字有两个作用,一是返回一个值(相当于return功能),二是记住这个返回的位置。
它与普通函数的区别是,生成器函数可用于迭代,迭代的逻辑是:
每次遍历,都会从上一次 yield 关键字结束的地方开始执行,直到遇见循环体中的下一个 yield 关键字才会终止。
注意:yield 关键字所在行后面的语句,在下一轮循环中才会被执行,本次循环中不会执行。
如果要从概念上找个类比的对象,那么它与C语言中的指针或者数据库中的游标非常相似。
听起来是不是很抽象,下面看个具体的代码就比较好理解了。
创建生成器的方式主要有两种,生成器表达式和生成器函数。
方式1、使用生成器表达式创建生成器
生成器表达式的方式最简单,与列表推导式类似,代码如下:
import time
import inspect
# 使用生成器表达式创建一个生成器对象
items = (item for item in '想和你说,今天的云和你,都十分可爱。')
# 判断一个变量是否是生成器
print(inspect.isgenerator(items))
# 遍历生成器
for value in items:
print(value, end='', flush=True)
time.sleep(0.1)
代码的功能是实现将一段文本逐字输出,类似于打字效果,执行结果如下:

方式2、使用生成器函数创建生成器
生成器函数方式,稍微有点复杂,代码如下:
import time
import inspect
# 使用 yield 关键字定义一个生成器函数
def split_text():
text = '想和你说,今天的云和你,都十分可爱。'
# 根据生成器的迭代逻辑,循环体的执行过程如下:
# 第1次循环稍有不同,它是直接返回一个字符;但是从第2次开始,每次循环都是先暂停0.1秒,然后再返回一个字符。
for item in text:
yield item
# 暂停的代码也可以放在遍历生成器对象的循环体中,放在此处仅仅是为了演示生成器的迭代逻辑
time.sleep(0.1)
# 调用函数创建一个生成器对象
items = split_text()
# 判断一个函数是否是生成器
print(inspect.isgeneratorfunction(split_text))
# 遍历生成器对象
for value in items:
print(value, end='', flush=True)
代码的功能同样是实现将一段文本逐字输出,类似于打字效果,执行结果如下:

注意:打字效果不一定需要生成器来实现,此处仅仅是为了演示生成器的用法。
259

被折叠的 条评论
为什么被折叠?



