VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • PythonI/O进阶学习笔记_9.python的生成器(2)

 
2.生成器对象原理
假设我们实现一个生成器函数:
def gen_func():
    yield 1
    name="bobby"
    yield 2
    age=30
    return "tangrong"
这个生成器对象实际上如下图所示:
实际上,就是在1中的PyFrameObject上面,再封了一层,为PyGenObject。
并且,再yield时候,实际上就是暂停了最近的那句代码。当时的上下文都是被保存的,即f_lasti,f_locals。在任何地方都可以暂停和控制它。
查看yield时,保存的lasti和locals:
复制代码
#input
def gen_func():
    yield 1
    name="bobby"
    yield 2
    age=30
    return "tangrong"
 
gen=gen_func()
print(gen.gi_frame.f_lasti)
print(gen.gi_frame.f_locals)
next(gen)
print(gen.gi_frame.f_lasti)
print(gen.gi_frame.f_locals)
next(gen)
print(gen.gi_frame.f_lasti)
print(gen.gi_frame.f_locals)
 
#outpu:
-1
{}
2
{}
12
{'name': 'bobby'}
复制代码

 

 
三.生成器的应用
1.生成器在Userlist中的应用
    我们知道,对list可以进行循环遍历。因为其是可迭代的。如果实现了__getitem__也是可以进行for遍历的。而且是会先去查找__iter__,没有发现__iter__魔法方法才会去找__getitem__方法。
    我们去看list类的源码的时候,其实就是提供了给我们看的接口,实际的c语言实现并看不到。而且我们在定制自己的List类的时候,是完全不提倡去继承list的,因为里面的很多关键方法是不能被重写的。但是python提供了UserList,即python实现的list。
首先,UserList是继承的MutableSequence。
而在MutableSequence的__iter__的实现中,就应用到了生成器。

相关教程