- 前言
- 生成器
- 概念
- 实例用法
- 生成器推导式
- 与生成器交互
- 生成器高级用法
- 使用建议
- 总结
前言
前一段时间项目上线,太忙了。今天趁着周六,继续Generator的探索之旅。上一篇,我们介绍过了迭代器的概念,很好用。使用了Generator之后,我稍微能触摸到Python的协程与同步编程的概念了。
生成器
概念
Python中提供了yield语句,在函数中使用,它可以暂停函数的执行,保存函数的状态,直到下一次调用。这种特性为很多问题提供了一个非常优雅的解决方案。
def gen():
print("Hello, world!")
yield 1
yield 2
yield 3
上面就定义了一个Generator。Generator的定义很简单,与函数的定义非常相似,只是函数体中有yield语句。我们来看看如何使用它:
for i in gen():
print i
输出结果:
Hello, world!
1
2
3
这个是怎么做到的呢?原来通过调用gen(),我们获得了一个Generator对象。在每次循环的时候,都会调用对象的next方法,与前一篇介绍的Iterator一样。我们可以这样来试验一下:
g = gen()
print(g)
打印结果:
<generator object gen at 0x01BBF0F8>
可见我们获得了一个Generator对象,注意这是函数并没有执行!!!
下次我们调用next对象的时候,函数从头开始执行,打印出Hello, world!和1。然后暂停,等待下一次执行。
g.next()
#Hello, world!
#1
g.next()
#2
g.next()
#3
g.next()
#Traceback (most recent call last):
# File "<stdin>", line 1, in <module>