zoukankan      html  css  js  c++  java
  • python协程初步---一个迭代器的实现

    一般认为迭代器就是实现了两个方法__iter__和__next__

    • 先创建这样一个类
    from collections import Iterable
    from collections import Iterator
    
    class classiterable(object):
        def __iter__(self):
            pass
        def __next__(self):
            pass
    
    
    class mycoach(object):
        def __init__(self):
            pass
        def addname(self):
            pass
        def __iter__(self):
            return classiterable()
    cpc = mycoach()
    
    print("类对象可以被迭代" if isinstance(cpc,Iterable) else "无法被迭代")

    输出结果:

    类对象可以被迭代

    通过在mycoach类的方法__iter__中返回classiterable实现了mycoach和classiterable类之间的联系

    • 实现classiterator访问mycoach类中的属性
    from collections import Iterable
    from collections import Iterator
    
    class classiterable(object):
        def __init__(self,obj):
            self.obj = obj
            self.count = 0 #添加一个计数器,确保按顺序遍历数组
    
        def __iter__(self):
            pass
        def __next__(self):
            #防止迭代过头
            if self.count<len(self.obj.coachname):
                ret = self.obj.coachname[self.count]
                self.count+=1
                return ret
            else:
                raise StopIteration
    
    class mycoach(object):
        def __init__(self):
            self.coachname=[]
        def addname(self,name):
            self.coachname.append(name)
        def __iter__(self):
            return classiterable(self)
    cpc = mycoach()
    cpc.addname('陈培昌')
    cpc.addname('程劲')
    cpc.addname('徐晓冬')
    for i in cpc:
        print(i)
    print("类对象可以被迭代" if isinstance(cpc,Iterable) else "无法被迭代")

    输出结果:

    陈培昌
    程劲
    徐晓冬
    类对象可以被迭代
    • 完全进化版本---mycoach内部实现__next__魔术方法
    class mycoach(object):
        def __init__(self):
            self.coachname=[]
            self.count=0
        def addname(self,name):
            self.coachname.append(name)
        def __iter__(self):
            return self
        def __next__(self):
            if self.count<len(self.coachname):
                ret = self.coachname[self.count]
                self.count+=1
                return ret
            else:
                raise StopIteration
    
    
    cpc = mycoach()
    cpc.addname('陈培昌')
    cpc.addname('程劲')
    cpc.addname('徐晓冬')
    for i in cpc:
        print(i)
    print("类对象可以被迭代" if isinstance(cpc,Iterable) else "无法被迭代")

    输出结果:

    陈培昌
    程劲
    徐晓冬
    类对象可以被迭代
    •  斐伯纳契数列
    class mywenwa(object):
        def __init__(self,num):
            self.a,self.b=0,1
            self.count=0
            self.times=num
        def __iter__(self):
            return self
        def __next__(self):
            if self.count <self.times:
                self.a,self.b = self.a+self.b,self.a
                ret = self.b
                return ret
            else:
                raise StopIteration
    saiwa = mywenwa(10)
    print(next(saiwa))
    print(next(saiwa))
    print(next(saiwa))
    print(next(saiwa))
    print(next(saiwa))
    print(next(saiwa))
    print(next(saiwa))
    print(next(saiwa))
    print(next(saiwa))
    .......

    输出结果:

    0
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
  • 相关阅读:
    Linux Shell 01 脚本与变量
    Linux下shell颜色配置
    Linux下Redis安装及配置
    Linux Shell 03 条件测试
    OSX下VirtualBox安装CentOS
    Log4j配置与使用
    Linux 环境变量的配置
    OS X下安装Redis及配置开机启动
    圈复杂度
    (转)Qt Model/View 学习笔记 (一)——Qt Model/View模式简介
  • 原文地址:https://www.cnblogs.com/saintdingspage/p/11621820.html
Copyright © 2011-2022 走看看