zoukankan      html  css  js  c++  java
  • 十七. __next__和__iter__实现迭代器协议

    一. __next__和__iter__实现迭代器协议

    #_*_coding:utf-8_*_
    __author__ = 'Linhaifeng'
    class Foo:
        def __init__(self,x):
            self.x=x
    
        def __iter__(self):
            return self
    
        def __next__(self):
            n=self.x
            self.x+=1
            return self.x
    
    f=Foo(3)
    for i in f:
        print(i)
    
    简单示范
    class Da(object):
    
        def __init__(self,num):
            self.num=num
    
        def __iter__(self):
             return  self
        def __next__(self):
            if self.num>=88:
                raise  StopIteration ("你有一场")
            self.num+=1
            return  self.num
    aa=Da(1)
    
    # for i in aa:
    #     print(i)
    
    bb=aa.__iter__()
    print(bb.__next__())
    print(bb.__next__())
    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
    
    f=Foo(1,5)
    from collections import Iterable,Iterator
    print(isinstance(f,Iterator))
    
    for i in Foo(1,5):
        print(i)
    class Range:
        def __init__(self,n,stop,step):
            self.n=n
            self.stop=stop
            self.step=step
    
        def __next__(self):
            if self.n >= self.stop:
                raise StopIteration
            x=self.n
            self.n+=self.step
            return x
    
        def __iter__(self):
            return self
    
    for i in Range(1,7,3): #
        print(i)
    
    练习:简单模拟range,加上步长
    class Fib:
        def __init__(self):
            self._a=0
            self._b=1
    
        def __iter__(self):
            return self
    
        def __next__(self):
            self._a,self._b=self._b,self._a + self._b
            return self._a
    
    f1=Fib()
    
    print(f1.__next__())
    print(next(f1))
    print(next(f1))
    
    for i in f1:
        if i > 100:
            break
        print('%s ' %i,end='')
    
    斐波那契数列
  • 相关阅读:
    SQL练习题
    数据库基础
    Java-反射与注解
    Linux基础
    pipeline的使用示例
    vagrant与vrtualbox的使用
    12.04公有,私有属性,析构函数,成员属性
    12.1面向对象编程的介绍(oop):封装,继承,多态,访问私有属性
    mysql操作之二:fetchone与获取lastrowid
    10.02经典类的bug
  • 原文地址:https://www.cnblogs.com/Sup-to/p/11087379.html
Copyright © 2011-2022 走看看