#yeild关键字的理解
####结合 Python yield 使用浅析 文章 与彻底理解Python中的yield
####以后有理解了在补充
带有 yield 的函数在 Python 中被称之为 generator(生成器)
##1.求Fibonacci数列
def fab(max):
n,a,b = 0, 0, 1
while n < max:
print b
a, b = b, a + b
n = n + 1
###执行结果
1
1
2
3
5
##2.改进一:返回一个列表
def fab(max):
n,a,b = 0, 0, 1
list = []
while n < max:
lsit.append(b)
a, b = b, a + b
n = n + 1
return list
##3.改进二:返回一个生成器
####生成器就要将函数写成一个支持iterable的类,如下
class Fab(Object):
def init(self, max):
self.max = max
self.n, self.a, self.b = 0, 0, 1
def iter(self):
return self
def next(self):
if self.n < self.max:
r = self.b
self.a, self.b = self.b, self.a + self.b
return r
raise StopIteration()
###执行结果
fa.next()
1
fa.next()
1
fa.next()
2
fa.next()
3
fa.next()
5
fa.next()
StopIteration…
##4.改进三:使用yeild关键字返回一个生成器
def fab(max):
n,a,b = 0, 0, 1
while n < max:
yeild b
a, b = b, a + b
n = n + 1
###执行结果
for n in fab(5):
print n
1
1
2
3
5
###此时fab返回的是一个generator对象,放在for循环中进行迭代,n 就是取其中的元素(通过迭代器自由的next()方法)
##5. 实例理解yeild操作
#encoding:UTF-8
def yield_test(n):
for i in range(n):
yield call(i)
print("i=",i)
#做一些其它的事情
print("do something.")
print("end.")
def call(i):
return i*2
###执行结果
####[252] 表示notebook的编辑器代码行数
[252]f = yeild_test(5)
[253]f.next()
0
[254]f.next()
(‘i=’,0)
2
[255]f.next()
(‘i=’,1)
4
[256]f.next()
(‘i=’,2)
6
[257]f.next()
(‘i=’,3)
8
[258]f.next()
('i='4)
do something.
end.