Python 迭代器原理简述

迭代器

迭代器就是可以使用 for 循环的对象, list 、str 、tuple ….

那怎样才能实现这样的迭代?

nums = [12,13,14]
strs = "python"
tuples = (1,2,3,4,5)
for num in nums:
    print(num)

一个对象可迭代的条件

需要这个对象有 __iter__()方法

class Classmate(object):

    # 有了这个方法 该类就是可迭代的
    def __iter__(self):
        pass

添加一个列表添加方法给Classmate类

class Classmate(object):
    def __init__(self):
        # 存储
        self.namesList = list()

    def add(self, other):
        # 添加到列表里
        self.namesList.append(other)

    # 有了这个方法 该类就是可迭代的
    def __iter__(self):
        pass

迭代器

一个对象有 __iter__()__next__() 方法叫迭代器

如果使该对象可以返回迭代的数据:就需要一个迭代器的__next__()方法

定义一个迭代器类

class ClassIterator(object):

    def __iter__(self):
        pass

    def __next__(self):
        pass

完善一个可以执行的迭代器

迭代对象的 __iter__() 方法需要返回一个迭代器对象

# 可迭代对象
class Classmate(object):
    def __init__(self):
        self.namesList = list()

    def add(self, other):
        self.namesList.append(other)

    # 有了这个方法 该类就是可迭代的
    def __iter__(self):
        # 需要反对一个 迭代器对象
        # 把 self 传给 迭代器, 使迭代器可以获取 self.namesList
        return ClassIterator(self)

# 迭代器对象
class ClassIterator(object):

    def __init__(self, obj):
        self.nameList = obj.namesList
        # 记录循环的次数
        self.count = 0

    def __iter__(self):
        pass

    def __next__(self):
        if self.count < len(self.nameList):
            name = self.nameList[self.count]
            self.count+=1
            return name
        else:
            # 自定义一个异常 停止循环
            raise StopIteration

# 主函数
classmate = Classmate() # 实例化对象
classmate.add("小小") 
classmate.add("大大")
classmate.add("中中")

# for 循环对象
for name in classmate:
    print(name)

把 迭代对象类 和 迭代器类 合并

迭代对象和迭代器是两个类,那是否可以合并

class Classmate(object):
    def __init__(self):
        self.namesList = list()
        self.count = 0

    def add(self, other):
        self.namesList.append(other)

    # 有了这个方法 该类就是可迭代的
    def __iter__(self):
        # 需要反对一个 迭代器对象
        # 把 列表 传给 迭代器
        return self

    def __next__(self):
        if self.count < len(self.namesList):
            name = self.namesList[self.count]
            self.count+=1
            return name
        else:
            # 自定义一个异常 停止循环
            raise StopIteration

mark

发表评论 / Comment

用心评论~