python中的yield生成器详解

 #原创,转载请先联系

在学习生成器之前,必须先了解一下迭代器。因为生成器就是一种特殊的迭代器,而且生成器用起来更加优雅。

迭代器的详解可以参考我的另一篇博文:

# 列表生成式L = [x for x in range(5)] print(L)  #简单的生成器G = (x for x in range(5))  # G就是一个生成器,也是一个迭代器,迭代器也是可迭代对象,所以这个G也可以说是可迭代对象print(next(G)) print(next(G)) print(next(G)) print(next(G)) print(next(G))  输出: [0, 1, 2, 3, 4] 0 1234
复制代码

把列表生成器的[]改为()就变成一个简单的生成器。由上面的例子,我们大概可以知道,生成器就是一个迭代器,把数据一个一个拿出来,可以减少内存的负担。

那么,yield又是一个什么东西呢?为什么说他优雅呢?

当我们写的代码输出的结果,想一个一个出来。有两种常用的方法:

方法1.我们可以创建一个迭代器类,然后把代码写进类里,用类来创建一个可迭代对象,然后用next()函数一个一个把结果迭代出来。

方法2.我们可以用代码函数的合适位置加上yield,这时候这个函数就变成一个生成器了,不需要再创建一个迭代器类,不需要再写__iter__,__next__方法了。这样一来不是很方便,很优雅吗?哈哈哈哈~

口说无凭,下面我们2个方法都做一下,让你们体会一下:

我们做一个斐波那契的数列生成器。斐波那契数列的第一个数是0,第二个数是1,第三个数是第一、二个数相加,第四个数是第二、三个数相加......

方法1:

复制代码
class FeiboIterator():     def __init__(self):         self.a = 0         self.b = 1    def __iter__(self):         return self      def __next__(self):             num = self.a             self.a,self.b = self.b,self.a+self.b             return num   iterator = FeiboIterator() print(next(iterator)) print(next(iterator)) print(next(iterator)) print(next(iterator)) print(next(iterator)) print(next(iterator)) print(next(iterator)) print(next(iterator))  输出:
0
1235813
复制代码

是不是很麻烦?又要初始化,又要写__iter__和__next__魔方方法。

方法2:

复制代码
def feibo():     a = 0     b = 1    while
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信