返回

迭代器、生成器、可迭代对象三者间的关系和用法

闲谈

前言

上次我们简单分享了迭代器和生成器,本次我们来更加深入的了解相关概念和使用方法,希望能对你有所帮助。

自定义迭代器

首先,我们来看看怎么自定义迭代器。

class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == len(self.data):
            raise StopIteration
        item = self.data[self.index]
        self.index += 1
        return item


my_iterator = MyIterator([1, 2, 3, 4, 5])

for item in my_iterator:
    print(item)

这段代码自定义了一个名为MyIterator的迭代器类,该类有一个__iter__()方法和一个__next__()方法。iter()方法返回自身,使该类成为一个可迭代对象。next()方法返回迭代器当前指向的元素,并将其索引加1。当索引达到列表的长度时,next()方法会抛出StopIteration异常,表示迭代已经结束。

在代码的最后,我们创建了一个MyIterator对象并将其赋值给my_iterator变量。然后,我们使用for循环来遍历my_iterator中的元素。由于MyIterator是一个可迭代对象,因此它可以被用作for循环的迭代器。在每次迭代中,for循环都会调用my_iterator的__next__()方法来获取当前指向的元素,并将其打印出来。

生成器

生成器是一种特殊的迭代器,它使用yield来生成元素。生成器函数与普通函数的不同之处在于,它在执行过程中可以暂停并返回一个值,然后在需要时继续执行。

def my_generator():
    for i in range(5):
        yield i


for item in my_generator():
    print(item)

这段代码定义了一个名为my_generator()的生成器函数。该函数使用yield关键字来生成元素。在第一次调用my_generator()时,函数执行到第一个yield语句,然后暂停执行并返回一个生成器对象。生成器对象是一个可迭代对象,因此它可以被用作for循环的迭代器。在每次迭代中,for循环都会调用生成器对象的__next__()方法来获取当前指向的元素,并将其打印出来。

当for循环执行到最后一个yield语句时,生成器函数会继续执行,直到函数结束。在函数结束时,生成器对象会抛出StopIteration异常,表示迭代已经结束。

可迭代对象

可迭代对象是指可以被for循环遍历的对象。可迭代对象可以是列表、元组、字符串、字典、集合等。

要判断一个对象是否是可迭代对象,可以使用isinstance()函数。例如:

>>> isinstance([1, 2, 3], Iterable)
True
>>> isinstance("Hello", Iterable)
True
>>> isinstance(123, Iterable)
False

isinstance()函数的第一个参数是要判断的对象,第二个参数是可迭代对象的类型。如果要判断的对象是可迭代对象的实例,则isinstance()函数返回True,否则返回False。

迭代器、生成器和可迭代对象的区别

  • 迭代器是一种对象,它可以被for循环遍历。
  • 生成器是一种特殊的迭代器,它使用yield关键字来生成元素。
  • 可迭代对象是指可以被for循环遍历的对象。

迭代器和生成器都是可迭代对象,但可迭代对象不一定是迭代器或生成器。例如,列表、元组、字符串、字典、集合等都是可迭代对象,但它们不是迭代器或生成器。

总结

迭代器、生成器和可迭代对象是Python中非常重要的概念。掌握了这些概念,可以帮助我们更好地理解和使用Python。