Python3.x

来源:互联网 发布:广联达算量软件多少钱 编辑:程序博客网 时间:2024/05/21 08:58

迭代器

迭代器有两个重要部分
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 +1x = fab(5)for i in x:    print(i)

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

原创粉丝点击