【1.130】__next__ __iter__ 实现迭代协议

1、基本的迭代器:

 

class Foo:
    def __init__(self,x):
        self.x = x
    def __iter__(self):
        return self
    def __next__(self):
        self.x = self.x+1
        return self.x
f1 = Foo(2)

for i in range(1000):
    if i <= 5:
        print(i)
    else:
        break
 # 0 1 2 3 4 5   这里不判断就运行到 1000


for i in f1:
    if i <= 5:
        print(i)
    else:
        break
# 3 4 5  这里不判断就一一直运行 直到内存溢出  需药抛出错误  或 判断运行范围

 

 

 

2、看看 没有步长 默认为1 的range

 

class Foo:
    def __init__(self,start,stop):
        self.num = start
        self.stop = stop
    def __iter__(self):
        return self
    def __next__(self):
        if self.num >= self.stop:
            raise StopIteration
        n = self.num
        self.num += 1
        return  n
for i in Foo(5,10):
    print(i)

#5 6 7 8 9   这里就range 一样有范围了 超出范围就报错  stopiteration

for i in range(5,10):
    print(i)    

# 5 6 7 8 9   这里是range实现迭代的  程序内 也是实现了报错机制

 

 

 

3、看看有步长的  range  

class Foo:
    def __init__(self,start,stop,step):
        self.start = start
        self.stop = stop
        self.step = step
    def __iter__(self):
        return self
    def __next__(self):
        if self.start >= self.stop:
            raise StopIteration
        n =  self.start
        self.start += self.step
        return  n
for i in Foo(5,20,3):
    print(i)

#5 8 11 14 17

for i in range(5,20,3):
    print(i)

#5 8 11 14 17

 

 

4、看看斐波拉切 数列

class Fib:
    def __init__(self):
        self.num1 = 0
        self.num2 = 1
    def __iter__(self):
        return self
    def __next__(self):
        self.num1,self.num2 = self.num2,self.num1+self.num2
        return self.num1

for i in Fib():
    if i < 100:
        print (i,end=" ")
    else:
        break
        
#1 1 2 3 5 8 13 21 34 55 89 

 

posted @ 2019-07-03 16:01  科学小怪癖  阅读(95)  评论(0)    收藏  举报