Python yield与send,iter与next

  说起迭代器就想起了C++的,运用模板写的很精妙,让各种容器用起来十分方便,所以来学学Python一些,以方便使用python。

(先写一部分,后面再补充)

Iter与Next

  对于可以用for遍历的容器,都是可迭代对象,如dict,list,trulp,遍历的实现应该都是通过迭代器__iter__访问,通过__next__()遍历。

class Fb:
    def __init__(self,n=None):
        self.n=n
        self.a,self.b=0,1

    def __iter__(self):
        return self

    def __next__(self):       
        self.a,self.b=self.b,self.a+self.b
        if self.a>10:
            raise StopIteration
        return self.a

    def fb(self):
        s=0
        while(s<self.n):
            self.a,self.b=self.b,self.a+self.b
            s+=1
        return self.a

  这样写,用for遍历的时候,每次返回它本身的对象,然后调用next(),直到StopIterration,也就是不可以迭代才退出for遍历。

yield与send

  yield可以让函数变成一个生成器,而生成器对象是迭代器,一般用于循环中,拿下面的for循环来说,当程序运行到while循环 yield b,它就换把这次循环挂起并返回值b给迭代器,然后不运行接下来的,而是把b这个值传到下一次循环,下一次循环运行结束,就返回上一次的返回值的点继续运行完成当次循环,send就是上一次yield的返回值也就是(yield b)的值如果要修改b的值测试是否修改,可以这样写 b=yield b来看每次的返回值

def Fbd(n):
    s,a,b=0,0,1
    while(s<n):
        yield b
        a,b=b,a+b
        s=s+1
 d=Fbd(5)  #类型是一个生成器,只能用来遍历
 print (d.__next__())#1
 print (d.__next__())#1
 print (d.__next__())#2
 for i in Fbd(5)

猜你喜欢

转载自blog.csdn.net/qq_21049875/article/details/79101583