什么是生成器?
就是比迭代器简单一些的特殊迭代器。(自我理解,欢迎指正)
创建生成器的方法A
#!/usr/bin/env python2.7
# -*- coding=utf-8 -*-
# 第一种方法还是蛮简单的,就是将列表推导中[]修改为()即可
L = [ x*2 for x in range(5)]
print L
# >>> [0, 2, 4, 6, 8]
G = ( x*2 for x in range(5))
print G
# >>> <generator object <genexpr> at 0x7f626c132db0>
"""
创建 L 和 G 的区别仅在于最外层的 [ ] 和 ( ) , L 是一个列表,而 G 是一个生成器。我们可以直接打印出列表L的每一个元素,而对于生成器G,我们可以按照迭代器的使用方法来使用,即可以通过next()函数、for循环、list()等方法使用。
"""
next(G)
# >>> 0
next(G)
# >>> 2
..
..
..
StopIteration
# 或者使用for循环
for i in G:
print i
# >>> 0
# >>> 2
# >>> 4
# >>> 6
# >>> 8
创建生成器的方法B
#!/usr/bin/env python2.7
# -*- coding=utf-8 -*-
# 第二种方法就是将迭代器next方法缩写到生成器一个方法中了
# 例如斐波那契编写
from collections import Iterator
def fabonacci(num):
index = 0
a, b = 0, 1
while index < num:
val = a
b, a = a, a + b
index += 1
yield val
return
fab = fabonacci(5)
print(isinstance(fab, Iterator)) # true
print(next(fab))
print(next(fab))
print(next(fab))
print(next(fab))
print(next(fab))
总结:
- 使用了yield关键字的函数不再是函数,而是生成器。(使用了yield的函数就是生成器)
- yield关键字有两点作用:
- 保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起
- 将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用
- 可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数)
- Python3中的生成器可以使用return返回最终运行的返回值,而Python2中的生成器不允许使用return返回一个返回值(即可以使用return从生成器中退出,但return后不能有任何表达式)。
练习题:
# 杨辉三角
def triangles():
L =[1]
while True:
yield L[:]
L.append(0)
L=[L[i]+L[i-1] for i in range(len(L))]
n = 0
results = []
for t in triangles():
results.append(t)
n = n + 1
if n == 10:
break
for t in results:
print(t)