手写 Python 虚拟机
海纳
华为资深编译专家,原 Huawei JDK 团队负责人
1322 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已更新 33 讲/共 35 讲
导学|直播加餐:三小时掌握C++ (3讲)
手写 Python 虚拟机
15
15
1.0x
00:00/00:00
登录|注册

29|Generator:一种无栈协程的简易实现

你好,我是海纳。
上一节课我们主要是实现了异常功能,并且实现了 StopIteration 异常,依赖它重构了 FOR_ITER 循环。这一节课,我们就依赖于 StopIteration 异常来实现 Python 虚拟机中的另外一个重要功能——Generator。

自定义迭代器类

Python 中可以通过自定义迭代器类来实现迭代功能。其中包含了两个步骤,一个是新建一个迭代器对象,另一个是在这个迭代器对象执行迭代。
我们知道,使用 for 语句的时候,会涉及到两个字节码,分别是 GET_ITER 和 FOR_ITER。GET_ITER 的作用是对一个可遍历对象,取得它的迭代器,FOR_ITER 的作用是针对迭代器进行迭代。
Python 也提供了机制让我们可以手动实现这个功能,与 GET_ITER 字节码等价的是 iter 函数,与 FOR_ITER 等价的则是 next 方法。我们通过例子来说明这个问题。
lst = [1, 2]
itor = iter(lst)
while True:
try:
print(next(itor))
except StopIteration as e:
break
for i in lst:
print(i)
使用第 10 行和 11 行的 for 的写法的迭代过程,与第 4 行至第 8 行的 while 的写法是完全等价的。只是 for 循环隐藏掉了迭代器,而 while 循环则显式地持有一个迭代器。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. 介绍了如何通过自定义迭代器类来实现迭代功能,包括使用 for 语句涉及到的 GET_ITER 和 FOR_ITER 字节码,以及手动实现这个功能的方法。 2. 讲解了 iter 函数的实现,类似于 len 函数,只要在自定义类中实现了 `__iter__` 方法,这个类的实例就可以作为 iter 函数的参数来获取它的迭代器。 3. 通过 yield 关键字实现 Generator,使得函数返回一个 Generator 对象,支持迭代操作。 4. 分析了 Generator 对象的字节码,探究了如何通过字节码中的 flags 值来判断函数是否返回一个 Generator。 5. 解释了 yield 语句的作用,以及在 Generator 对象上进行迭代时的行为。 6. 探讨了 Generator 对象的接口定义和 yield 指令的意义。 7. 介绍了如何使用迭代器来实现 Fibnacci 数列的计算,通过在自定义类中提供 `__iter__` 方法来创建迭代器,以及在迭代器类中实现 next 方法来进行每次迭代,最后通过 raise StopIteration 来结束迭代。 8. 实现了 Generator 类,支持迭代器的功能,保存函数执行的中间状态,以及在迭代结束后保存局部变量的值供下一次迭代使用。 9. 完善了迭代的实现机制,基于 StopIteration 异常,实现了 Generator 机制。 10. 总结了课程的任务,包括对 Generator 对象的迭代器和 YIELD_VALUE 指令的执行逻辑,以及思考题中对进一步实现元类、文件等功能的支持。 These key points summarize the main topics covered in the article, focusing on the implementation and functionality of custom iterators, the concept and implementation of Generators, and the completion of the iteration mechanism based on StopIteration exception.

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手写 Python 虚拟机》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部