欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python中的迭代器的实现

程序员文章站 2022-05-03 18:06:06
...

案例引入
斐波那契数列的实现

1.无返回值

def feb(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b,end='\t')
        a, b = b, a + b
        n += 1

该方法返回的值是None,其他变量无法访问这个数列,复用性差

2.返回一个列表

def feb(max):
    n, a, b = 0, 0, 1
    L = []
    while n < max:
        L.append(b)
        a, b = b, a + b
        n += 1
    return L              #返回一个列表,可迭代对象


for i in feb(5):
    print(i)

list是一个可迭代对象,但该函数在运行中占用的内存会随着参数 max 的增大而增大,如果要控制内存占用,最好不要用 List

3.运用迭代器

class feb():
    def __init__(self, Max):
        self.n = 0
        self.a = 0
        self.b = 1
        self.Max = Max

    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
        else:
            raise StopIteration()


for i in feb(5):
    print(i)

含有__next__()的类都是一个迭代器对象,如果不含有__iter则要用一个变量去接收这个迭代器,feb()通过next()不断返回下一个数,内存始终为常量
如果n>Max 则抛出StopIteration()异常,程序停止

4.yiled的使用创建迭代器

def feb(Max):
    n, a, b = 0, 0, 1
    while n < Max:
        yield b
        a, b = b, a + b
        n += 1


for i in feb(5):
    print(i)

yield相当于是return,但是函数在yiled的位置挂起,当下一次访问next()时会从挂起的位置继续执行

def foo():
    print("starting...")
    while True:
        res = yield 4  # -->yield 会return 4 ,则res就会被赋值为None
        print("res:", res)


g = foo()         #相当于创建了一个对象,但是因为函数中有yield所以不执行函数
print(next(g))    #因为运用了next函数,则g开始执行,到yield的位置,返回4,但是没有将变量赋值,函数在此挂起
print("*" * 20)
print(next(g))    #因为yield是个返回值,所有res被赋值为None,然后执行下面的语句,直到下一次循环的yield 4 ,返回4然后输出4,函数再次挂起
print("*" * 20)
print(g.send(7))   # send-->包含next()但会先将7赋值给res

输出如下:

> starting...
4
********************
res: None
4
********************
res: 7
4

迭代器的作用是,每次next()返回一个值,内存被固定,即使在多的数据,在迭代器的作用下内存的使用也是很小的

相关标签: python python