Python知识巩固(迭代器)

迭代器

  1. from collections import Iterable
    isinstance(a,Iterable) 可以用来判断是否是可以迭代的对象
    iter() 放可以迭代的对象,它的返回值是一个迭代器
    from collections import Iterator
    isinstance(a,Iterator) 可以用来判断是否是迭代器
    next() 放迭代器


  2. 结合程序
    from collections.abc import Iterable,Iterator
    
    class Classmate(object):
        def __init__(self):
            self.names = list()
        def add(self,name):
            self.names.append(name)
        def __iter__(self):
            """如果想要一个对象称之为一个 可以迭代的对象,
                既可以适用for,那必须实现__iter__方法
            """
            return ClassIterator(self)  # 返回一个具有__iter__,__next__方法的对象的引用
                                        # 因为ClassIterator需要列表names
                                        # 就把自己这个对象传给ClassIterator
    class ClassIterator(object):
        def __init__(self,obj):
            self.obj = obj
            self.num = 0
        def __iter__(self):
            pass
        def __next__(self):
            if self.num < len(self.obj.names):
                r = self.obj.names[self.num]
                self.num += 1
                return r
            else:
                raise StopIteration
    
    classmate = Classmate()
    classmate.add("老王")
    classmate.add("老张")
    classmate.add("老李")
    
    """
    print("判断classmate是否是可以迭代的对象:",isinstance(clasasmate,Iterable))
    classmate_iterator = iter(Classmate) #会自动调用Classmate的__iter__方法,
                                    # classmate_iterator就变成了ClassIterator对象
    print("判断classmate_iterator是否是迭代器:",isinstance(clasasmate_iterator,Iterable))
    print(next(classmate_iterator))   #会自动调用ClassIterator的__next__方法
    """
    
    for i in classmate:
        print(i)
    

     

  3. 既然如此,就可以把自己当成ClassIterator,最后应该变成这样
    from collections.abc import Iterable,Iterator
    
    class Classmate(object):
        
        def __init__(self):
            self.names = list()
            self.num = 0
        def add(self,name):
            self.names.append(name)
        def __iter__(self):
            return self 
        def __next__(self):
            if self.num < len(self.names):
                r = self.names[self.num]
                self.num += 1
                return r
            else:
                raise StopIteration
            
    
    classmate = Classmate()
    classmate.add("老王")
    classmate.add("老张")
    classmate.add("老李")
    
    for i in classmate:
        print(i)
    

      

  4. 迭代器的应用————斐波那契数列

 

posted @ 2020-02-29 18:15  otome  阅读(183)  评论(0编辑  收藏  举报