迭代器笔记:

什么是可迭代对象:

  1. 用来做什么的:用来给for...in...遍历的。
  2. 已知的数据类型:listdicttuplestrset、生成器。
  3. 需要满足的条件:需要实现一个__iter__的方法,并且这个方法要返回一个迭代器对象。

什么是迭代器:

  1. 用来做什么的:用来返回数据的,每次循环的时候都会调用迭代器的__next__或者next函数,通过这个方法来获取数据
  2. 需要满足的条件:
    • Python2中:要实现两个方法,分别是__iter__方法和next方法。
    • Python3中:要实现两个方法,分别是__iter__方法和__next__方法。

iter函数:

用来获取一个可迭代对象的迭代器。

自己动手写一个可以用for...in...遍历的结构:

class MyRangeIterator(object):
    def __init__(self,start,end):
        self.index = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        if self.index < self.end:
            temp = self.index
            self.index += 1
            return temp
        else:
            raise StopIteration()

class MyRange(object):
    """
    MyRange是可迭代对象
    """
    def __init__(self,start,end):
        self.start = start
        self.end = end

    def __iter__(self):
        # 这个方法中要返回一个迭代器对象
        return MyRangeIterator(self.start,self.end)

ret = MyRange(1,10)
for x in ret:
    print(x)

如果将迭代器和可迭代对象两个身份都放在同一个对象中,那么这时候,这个可迭代对象就只能遍历一次:

class MyRange(object):
    """
    MyRange是可迭代对象
    """
    def __init__(self,start,end):
        self.start = start
        self.end = end
        self.index = start

    def __iter__(self):
        # 这个方法中要返回一个迭代器对象
        return self

    def __next__(self):
        if self.index < self.end:
            temp = self.index
            self.index += 1
            return temp
        else:
            raise StopIteration()

my_range = MyRange(1,10)
for x in my_range:
    print(x)

print('='*10)
for y in my_range:
    print(y)