生成器(generator)内部解析

#http://kb.cnblogs.com/page/87128/(未看完)

2.7. 生成器(generator)

  生成器是调用一个生成器函数(generator function)返回的对象,多用于集合对象的迭代。

  • __iter__: 仅仅是一个可迭代的标记。
  • gi_code: 生成器对应的code对象。
  • gi_frame: 生成器对应的frame对象。
  • gi_running: 生成器函数是否在执行。生成器函数在yield以后、执行yield的下一行代码前处于frozen状态,此时这个属性的值为0。
  • next|close|send|throw: 这是几个可调用的方法,并不包含元数据信息,如何使用可以查看生成器的相关文档。

def gen():
for n in xrange(5):
yield n
g = gen()
print g # <generator object gen at 0x...>
print g.gi_code # <code object gen at 0x...>
print g.gi_frame # <frame object at 0x...>
print g.gi_running # 0
print g.next() # 0
print g.next() # 1
for n in g:
print n, # 2 3 4

接下来讨论的是几个不常用到的内置对象类型。这些类型在正常的编码过程中应该很少接触,除非你正在自己实现一个解释器或开发环境之类。所以这里只列出一部分属性,如果需要一份完整的属性表或想进一步了解,可以查看文末列出的参考文档。

2.8. 代码块(code)

  代码块可以由类源代码、函数源代码或是一个简单的语句代码编译得到。这里我们只考虑它指代一个函数时的情况;2.5节中我们曾提到可以使用函数的func_code属性获取到它。code的属性全部是只读的。

  • co_argcount: 普通参数的总数,不包括*参数和**参数。
  • co_names: 所有的参数名(包括*参数和**参数)和局部变量名的元组。
  • co_varnames: 所有的局部变量名的元组。
  • co_filename: 源代码所在的文件名。
  • co_flags:  这是一个数值,每一个二进制位都包含了特定信息。较关注的是0b100(0x4)和0b1000(0x8),如果co_flags & 0b100 != 0,说明使用了*args参数;如果co_flags & 0b1000 != 0,说明使用了**kwargs参数。另外,如果co_flags & 0b100000(0x20) != 0,则说明这是一个生成器函数(generator function)。

co = cat.sayHi.func_code
print co.co_argcount # 1
print co.co_names # (‘name‘,)
print co.co_varnames # (‘self‘,)
print co.co_flags & 0b100 # 0

2.9. 栈帧(frame)

  栈帧表示程序运行时函数调用栈中的某一帧。函数没有属性可以获取它,因为它在函数调用时才会产生,而生成器则是由函数调用返回的,所以有属性指向栈帧。想要获得某个函数相关的栈帧,则必须在调用这个函数且这个函数尚未返回时获取。你可以使用sys模块的_getframe()函数、或inspect模块的currentframe()函数获取当前栈帧。这里列出来的属性全部是只读的。

  • f_back: 调用栈的前一帧。
  • f_code: 栈帧对应的code对象。
  • f_locals: 用在当前栈帧时与内建函数locals()相同,但你可以先获取其他帧然后使用这个属性获取那个帧的locals()。
  • f_globals: 用在当前栈帧时与内建函数globals()相同,但你可以先获取其他帧……。

def add(x, y=1):
f = inspect.currentframe()
print f.f_locals # same as locals()
print f.f_back # <frame object at 0x...>
return x+y
add(2)

时间: 2024-10-07 15:15:29

生成器(generator)内部解析的相关文章

Python 迭代器、生成器和列表解析

迭代器 迭代器在 Python 2.2 版本中被加入, 它为类序列对象提供了一个类序列的接口. Python 的迭代无缝地支持序列对象, 而且它还允许迭代非序列类型, 包括用户定义的对象.即迭代器可以迭代不是序列但表现出序列行为的对象, 例如字典的 key , 一个文件的行, 等等.迭代器有以下特性: 提供了可扩展的迭代器接口. 对列表迭代带来了性能上的增强. 在字典迭代中性能提升. 创建真正的迭代接口, 而不是原来的随机对象访问. 与所有已经存在的用户定义的类以及扩展的模拟序列和映射的对象向后

Python高级编程之生成器(Generator)与coroutine(一):Generator

这是一系列的文章,会从基础开始一步步的介绍Python中的Generator以及coroutine(协程)(主要是介绍coroutine),并且详细的讲述了Python中coroutine的各种高级用法,最后会用coroutine实现一个简单的多任务的操作系统. 其实也是看完这篇文章的学习笔记吧!O(∩_∩)O 生成器(Generator) 什么是生成器?在Python中,生成器(Generator)是一个带有yield关键字的函数 1 def gene(): 2 a = 1 3 print "

ES6中的迭代器(Iterator)和生成器(Generator)

前面的话 用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简化数据操作,于是ES6也向JS中添加了这个迭代器特性.新的数组方法和新的集合类型(如Set集合与Map集合)都依赖迭代器的实现,这个新特性对于高效的数据处理而言是不可或缺的,在语言的其他特性中也都有迭代器的身影:新的for-of循环.展开运算符(...),甚至连异步编程都可以使用迭代器 本文将详细介

Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍

原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Generator Function的示例,这一小节,我们会介绍Python的coroutine,以及会有一个小例子,再接下来的文章中会以代码的形式一步步介绍coroutine的高级用法. coroutine(协程) 什么是coroutine?coroutine跟Generator有什么区别?下面先看一段

Python之生成器(generator)和迭代器(Iterator)

generator 生成器generator:一边循环一边计算的机制. 生成器是一个特殊的程序,可以被用于控制循环的迭代行为.python中的生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,可以使用next()函数和send()函数恢复生成器. 生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用.但是,不同于一般函数会一次性返回包括了所有数值的数组,生成器一次只能产生一个值,这个消耗的内存数量将大大减小.因此,生成器看起来像是一个函数,但是表现得像迭代

生成器generator

生成器generator 定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器 代码: def cash_out(amount): while amount >0: amount -= 1 yield 1<br> print("擦,又来取钱了...败家子!") ATM = cash_out(5) print("取到钱 %s 万" % ATM.__next__())

Python 生成器generator

列表的问题列表生成器可以直接创建一个表,但是,如果一个表中有100万个元素,那么这个表太占空间,而且往往我们仅仅需要访问前面几个元素,后面绝大多数元素占用的空间都白白浪费了. 生成器如果列表元素可以按照某种算法推算出来,那我们可以在循环的过程中不断的推算出后续的元素.而不用一开始就创建整个list.这样,节省了大量的空间.这种一遍循环一遍计算的机制,称为生成器:generator. 创建生成器generator.第一种方法:只要报一个列表生成式的[]改成(),就穿件了一个generator.创建

ORACLE之SQL语句内部解析过程【weber出品】

一.客户端通过监听连接到数据库,数据库开启一个server process进程来接收客户端传过来的sql. 1.这条sql语句从来都没有被执行过.(硬解析) 2.这条sql语句被执行过.(软解析) 二.我们来看一条SQL语句内部解析到底经历了什么? sql硬解析解析的步骤 1.语法检测:检测sql语句有没有语法错误,是否符合sql规范 2.语义检测:检测sql语句涉及的对象是否存在. 3.检查共享池中是否存在相同的已经执行过的sql语句. 4.通过数据字典的统计信息,来计算最优执行计划. sql

2015.1.5 用DBFactorySingleton写、读二进制字段与oralce CLOB类型字段读写[除非需要做内部解析,不要用CLOB,CLOB速度要比BLOB慢15倍以上]

//写 FileStream fstr = File.OpenRead(tb_filepath.Text); //openread函数用于打开只读文件,openwrite可写 BinaryReader br = new BinaryReader(fstr); byte[] buffer = br.ReadBytes((int)fstr.Length); string sql = string.Format("insert into NVDUSER_FLT.FILE_SOURCE values(1