狠狠撸

狠狠撸Share a Scribd company logo
Python
Generators

by laike9m
laike9m@gmail.com
https://github.com/laike9m
You don’t know what you don’t know
听说过,但不理解 >> 没听说过
Python generators
Python generators
Python generators
>>> def gen_ab():
...
print('starting...')
...
yield 'A'
...
print('here comes B:')
...
yield 'B'
...
print('the end.')

g = gen_ab(), 停在这里

第一次调用next(), 停在这里

第二次调用next(), 停在这里

生成器函数可以看成一串事件,yield暂停执行,next恢复执行
“yield 是 具有 暂停功能 的 return”
斐波那契数列:
0,1,1,2,3,5,8,11,19,...
前两个数是0,1,后一个数是前两个数之和
斐波那契数列生成器
for 循环
每次都会调用next()
更深入的讨论:interator(迭代器)

每次都把返回的a输出
注意yield是“具有暂停功能的return”
return a ( = yield a )
fib_number = a
然后打印出来
? 循环就是一个事件流,只不过里面
包含了一些条件判断
def fib(max):
a, b = 0, 1
while a < max:
yield a
a, b = b, a+b

等价于

def fib(max):
a, b = 0, 1
if a < max:
yield a
a, b = b, a+b
if a < max:
yield a
a, b = b, a+b
if a < max:
yield a
a, b = b, a+b
...
? 一起写一个斐波那契生成器
? enumerate 函数
list() : 调用next()直到不能调用为止,并且把返回值存入列表,实质就是列表解析
[i for i in enumerate(seasons)]
Python generators
g.next()是Python2.X
的写法,对应
Python3.X中的next(g)
? 有yield的函数:生成器函数
? yied是带暂停功能的return
? for, list 本质上是在调用next(obj)
? 把生成器函数看成事件流,yield暂停,next继续执行
? 生成器函数内部通常包含循环,循环也是事件流
? 把列表解析的中括号换成小括号就是生成器表达式
?快
? 内存占用小
需要的时候才会产生

? 语义上的含义
一次性使用

? 保存函数的当前执行环境,包括所有局部变量等
http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained
Q&A

More Related Content

Python generators