yeild关键字的理解

来源:互联网 发布:易奇八字准不准知乎 编辑:程序博客网 时间:2024/06/05 20:40

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

执行结果

11235

该函数有两大缺点

  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()1fa.next()1fa.next()2fa.next()3fa.next()5fa.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 n11235

此时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后面的代码。

原创粉丝点击