一些编程场景中,一件工作可能须要履行一部分逻辑,然后等待一段时光、或者等待某个异步的结不雅、或者等待某个状况,然后持续履行另一部分逻辑。比如微办事架构中,办事A履行了一段逻辑之后,去办事B请求一些数据,然后在办事A上持续履行。或者在游戏编程中,一个技能分成分多段,先履行一部分动作(效不雅),然后等待一段时光,然后再持续。对于这种须要等待、而又不欲望壅塞的情况,我们一般应用回调(callback)的方法。下面举一个简单的例子:
本文将由浅入深具体介绍yield以及generator,包含以下内容:什么generator,生成generator的办法,generator的特点,generator基本及高等应用处景,generator应用中的留意事项。本文不包含enhanced generator即pep342相干内容。
generator基本
generator高等应用
在python的函数(function)定义中,只要出现了yield表达式(Yield expression),那么事实上定义的是一个generator function, 调用这个generator function返回值是一个generator。这根通俗的函数调用有所差别,For example:
- def gen_generator():
- yield 1
- def gen_value():
- return 1
- if __name__ == '__main__':
- ret = gen_generator()
- print ret, type(ret) #<generator object gen_generator at 0x02645648> <type 'generator'>
- ret = gen_value()
- print ret, type(ret) # 1 <type 'int'>
大年夜膳绫擎的代码可以看出,gen_generator函数返回的是一个generator实例,generator有以下特别:
- 遵守迭代器(iterator)协定,迭代器协定须要实现__iter__、next接口
- 能过多次进入、多次返回,可以或许暂停函数体中代码的履行
下面看一下测试代码:
- >>> def gen_example():
- ... print 'before any yield'
- ... yield 'first yield'
- ... print 'between yields'
- ... yield 'second yield'
- ... print 'no yield anymore'
- ...
- >>> gen = gen_example()
- >>> gen.next()# 第一次调用next
- before any yield
- 'first yield'
- >>> gen.next()# 第二次调用next
推荐阅读
化繁为简 海云捷迅为企业提供应用OpenStack新“姿势”
在版本进级方面,OpenStack每半年就会宣布一个版本,这是它的立异过程,但企业客户更多求稳,不会过快的进行迭代进级。海云捷迅底层技巧是每两年一个版本,首版是基于OpenStack的E版本,二版本是H版,三版本是基于社>>>详细阅读
地址:http://www.17bianji.com/lsqh/36457.html
1/2 1