Python3.x - 迭代器 - yield用法

迭代器

迭代器有两个重要部分
1._iter_()
用来获取迭代器对象
2.next()
获取容器内下一个元素

自定义一个迭代器

斐波列数列 1 1 2 3 5 8 等于前两个数相加。

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
            self.n +=1
            return r
       raise StopIteration() #迭代器没有更多的值了,异常处理

yield用法

如果我们要写一个斐波列数列的函数
第一次写可能是这样的

def fab(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a+b
        n = n +1

没有返回值,使用print,不能让其他函数使用,

第二次,返回一个列表

def fab(max):
    n, a, b = 0, 0, 1
    list = []
    while n < max:
        list[n] = b
        a, b = b, a+b
        n = n +1

但是如果max = 1000000000能 内存岂不爆炸?

第三次
我们就考虑使用迭代器了

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
            self.n +=1
            return r
       raise StopIteration() #迭代器没有更多的值了,异常处理
x = Fab(5)
for i in x:
    print(i)

这样的话,内存占用一直是一个常数,但是这第三次的代码和第一次的代码比起来,好长。
简化之,使用yield

第四次

def fab(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a+b
        n = n +1
x = fab(5)
for i in x:
    print(i)

不能直接print yield类型的值 否则会输出一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值