yeild关键字的理解

#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

该函数有两大缺点

  1. 函数无返回值。一般函数是需要返回值,以便其他函数调用
  2. 就是因为没有返回值,该函数的复用性较低

##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

该函数的缺点

  1. 满足可复用,但是会随着元素的数目增加,列表无限增大,很快消耗掉内存

##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…

函数的缺点

  1. 函数虽然实现了迭代器的功能,但是不够简洁

##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.

说明执行迭代碰到yeild则会中断,返回一个值,下次迭代时再执行yeild后面的代码。

你可能感兴趣的:(python,python,yeild)