zoukankan      html  css  js  c++  java
  • 迭代器执行流程

    迭代器的执行流程,以及说明可迭代对象不一定是迭代器,但迭代器一定是可迭代对象

    实例1

    from collections import Iterable, Iterator
    import time
    
    
    class Classmate(object):
        """可迭代的对象(必须存在__iter__)"""
        def __init__(self):
            self.names = list()
    
        def add(self, name):
            self.names.append(name)
    
        def __iter__(self):
            """
            如果想要一个对象称为一个可以迭代的对象,即可以使用for,那么必须实现__iter__方法
            如return引用的是一个迭代器,则返回迭代器里__next__的返回值
            """
            return ClassIterator(self)
    
    
    class ClassIterator(object):
        """迭代器(必须同时存在__iter__和__next__)"""
    
        def __init__(self, obj):
            self.obj = obj
            self.current_num = 0
    
        def __iter__(self):
            pass
    
        def __next__(self):
            """for循环取出的name来自__next__的返回值"""
    
            if self.current_num < len(self.obj.names):
                ret = self.obj.names[self.current_num]
                self.current_num += 1
                return ret
            else:
                # 越界抛出异常退出
                raise StopIteration
    
    
    classmate = Classmate()
    
    classmate.add("")
    classmate.add("")
    classmate.add("")
    
    # print("判断classmate是否是可以迭代的对象:", isinstance(classmate, Iterable))
    # classmate_tierator = iter(classmate)
    # print("判断classmate_tierator是否是迭代器:", isinstance(classmate_tierator, Iterator))
    # print(next(classmate_tierator))
    
    # 1.for循环会先判断 classmate是否是可迭代的对象,若成立执行下面步骤
    # 2.for循环调用对象中的__iter__获取其返回值,如返回值是可迭代对象,执行下面步骤
    # 3.for每循环一次,则会调用迭代器里的__next__,获取其返回值,如未设置退出条件,则不停返回None
    for name in classmate:
        print(name)
        time.sleep(1)

    实例1的优化

    from collections import Iterable, Iterator
    import time
    
    
    class Classmate(object):
        """
        迭代器
        存在__iter__为可迭代对象
        同时存在__iter__和__next__为迭代器
        """
        def __init__(self):
            self.names = list()
            self.current_num = 0
    
        def add(self, name):
            self.names.append(name)
    
        def __iter__(self):
            """
            如果想要一个对象称为一个可以迭代的对象,即可以使用for,那么必须实现__iter__方法
            如return返回的是一个迭代器,则返回迭代器里__next__的返回值
            """
            return self
    
        def __next__(self):
            """for循环取出的name来自__next__的返回值"""
    
            if self.current_num < len(self.names):
                ret = self.names[self.current_num]
                self.current_num += 1
                return ret
            else:
                # 越界抛出异常退出
                raise StopIteration
    
    
    classmate = Classmate()
    
    classmate.add("")
    classmate.add("")
    classmate.add("")
    
    # 1.for循环会先判断 classmate是否是可迭代的对象,若成立执行下面步骤
    # 2.for循环调用对象中的__iter__获取其返回值,如返回值是可迭代对象,执行下面步骤
    # 3.for每循环一次,则会调用迭代器里的__next__,获取其返回值,如未设置退出条件,则不停返回None
    for name in classmate:
        print(name)
        time.sleep(1)
  • 相关阅读:
    Java学习第一周汇报
    Java暑期学习第八天日报
    Java暑期学习第十天日报
    Java暑期学习第十二天日报
    Java学习第二周汇报
    Java暑期学习第九天日报
    0006 列表(ul、ol、dl)
    0015 行高那些事:lineheight
    0016 CSS 背景:background
    HTTP中GET与POST的区别 99%的错误认识
  • 原文地址:https://www.cnblogs.com/Selling-fish-bears/p/10385654.html
Copyright © 2011-2022 走看看