【Python】迭代器,可迭代对象与生成器

迭代器

迭代器类型的定义:

  1. 当类中定义了__iter__和__next__两个方法。
  2. __iter__方法需要返回对象本身,即返回self。
  3. __next__方法,返回下一个数据,如果没有数据了,则需要抛出一个StopIteration的异常。
# 创建 迭代器类型
class IterExample():
    def __init__(self) -> None:
        self.counter = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.counter += 1
        if self.counter == 3:
            raise StopIteration()
        return self.counter

# 根据类实例化创建一个迭代器对象
iterExObj = IterExample()

# 这个最多能执行3次,3次之后就抛出StopIteration错误
v1 = iterExObj.__next__()

# 也可以这么执行,等价于
v1 = next(iterExObj)

# 迭代器对象支持for循环
for i in IterExample():
    # 首先会执行迭代器对象的__iter__方法并获取返回值,一直去反复的执行: next(IterExample())
    print(i)
  • 迭代器对象支持通过next取值,如果取值结束则自动抛出StopIteration。
  • for循环内部在循环时,先执行迭代器对象的__iter__方法并获取返回值,一直去反复的执行: next(IterExample())取值。有异常StopIteration则终止循环。
  • 迭代器更多的是为for循环提供一个逐步获取下一份数据的作用。

生成器

生成器类也是一种特殊的迭代器类(生成器也是一个特殊的迭代器)

# 创建生成器对象,在函数后面加()
# 生成器对象内部是根据生成器类generator创建的对象,内部也声明了__iter__和__next__方法
yObj = func()
v1 = next(yObj)
for i in func():
    print(i)
可迭代对象
  • 如果一个类有__iter__方法且返回一个迭代器对象(生成器对象),则这个对象为可迭代对象。
  • 可迭代对象可以被for循环。

可迭代对象和迭代器的区别

  • 可迭代对象返回的是一个迭代器对象,for循环是对这个迭代器对象进行循环。
  • 迭代器返回的是自身(self),for是对这个迭代器进行循环。
  • 可迭代器对象没有__next__方法,__iter__返回的是一个迭代器。
# 创建 迭代器类型
class IterExample():
    def __init__(self) -> None:
        self.counter = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.counter += 1
        if self.counter == 3:
            raise StopIteration()
        return self.counter

# 创建 可迭代类
class Foo():
    def __iter__(self):
        return IterExample()

对可迭代对象进行for循环时,内部会先执行obj.__iter__获取迭代器对象,再对这个迭代器对象执行next()

range()

range函数会返回一个可迭代对象,一般放在for循环里用。

常见的可迭代数据类型

  • list
  • set
  • tuple

判断是否是迭代器还是可迭代对象

v1 = [1, 2, 3, 4]

# 判断是否为可迭代对象,判断依据是是否有__iter__且返回可迭代器对象
print(isinstance(v1, Iterable))

# 判断是否迭代器,判断依据是__iter__和__next__
print(isinstance(v1, Iterator))
posted @ 2021-11-04 11:31  阿初  阅读(45)  评论(0编辑  收藏  举报