Python 中迭代器和生成器的区别

Jesse John 2023年1月30日
  1. Python 中的迭代器
  2. Python 中的生成器
  3. Python 中的迭代器和生成器示例
  4. 结论
Python 中迭代器和生成器的区别

迭代器和生成器帮助我们生成一些输出或迭代地处理一些代码,一次一位。在本文中,我们将通过一个简单的示例了解 Python 的迭代器和生成器之间的一些基本区别。

Python 中的迭代器

迭代器的基本特征如下:

  1. 迭代器是使用实现迭代器协议的类创建的对象。这意味着该类定义了 __iter____next__ 方法。
  2. __next__ 方法使用 return 语句返回一个值。由于 return 语句必须是该方法的最后一行,我们必须在 return 语句之前更新要在 __next__ 下一次运行中使用的变量。

在最简单的情况下,我们将看到,__iter__ 返回 self

Python 中的生成器

生成器的基本特征如下:

  1. 生成器是一个函数。
  2. 生成器函数使用 yield 关键字而不是 return 关键字。
    2.1 yield 关键字产生一个值并暂停函数的执行。
    2.2 对 next() 的下一次调用在 yield 语句之后恢复代码的执行。

生成器函数允许我们创建生成器迭代器,而无需使用类创建迭代器时所需的所有额外代码。

Python 中的迭代器和生成器示例

以下两个示例突出了前两节中提到的要点。这两个示例都说明了如何生成从 1 开始的整数平方。

第一个示例显示了如何使用迭代器完成它。第二个示例显示了使用生成器的等效代码。

迭代器的示例代码:

# ITERATOR (Class)


class squares(object):
    def __init__(self, num1):
        self.nxt_sq_of = 1
        self.lim = num1

    def __iter__(self):
        return self

    def __next__(self):

        if self.nxt_sq_of <= self.lim:
            ret_sq_of = self.nxt_sq_of
            self.nxt_sq_of += 1
            return ret_sq_of * ret_sq_of
        else:
            raise StopIteration


# Iterator Object
a = squares(6)

# Next value of the iterator.
next(a)
next(a)
next(a)
next(a)
next(a)
next(a)
next(a)
next(a)


# Using the iterator in a loop.
a1 = squares(6)

while True:
    print(next(a1))

输出:

next(a)
Out[3]: 1

next(a)
Out[4]: 4

next(a)
Out[5]: 9

next(a)
Out[6]: 16

next(a)
Out[7]: 25

next(a)
Out[8]: 36

next(a)
Traceback (most recent call last):

  File "<ipython-input-9-15841f3f11d4>", line 1, in <module>
    next(a)

  File "<ipython-input-1-9dbe8e565876>", line 17, in __next__
    raise StopIteration

StopIteration

生成器示例代码:

# GENERATOR FUNCTION


def gen_squares(num2):
    i = 1
    while i <= num2:
        yield i * i
        i += 1


# Generator iterator.
b = gen_squares(5)

# Next yield of the generator iterator.
next(b)
next(b)
next(b)
next(b)
next(b)
next(b)

输出:

next(b)
Out[3]: 1

next(b)
Out[4]: 4

next(b)
Out[5]: 9

next(b)
Out[6]: 16

next(b)
Out[7]: 25

next(b)
Traceback (most recent call last):

  File "<ipython-input-8-adb3e17b0219>", line 1, in <module>
    next(b)

StopIteration

结论

我们发现 Python 的生成器允许我们编写简洁的代码来创建生成器迭代器。

另一方面,迭代器更强大,因为它们允许程序员为 __iter__ 方法编写自定义代码。

有关详细信息,请参阅以下内容。

  1. 生成器的 Python Wiki 文章。
  2. 迭代器的 Python Wiki 文章。
作者: Jesse John
Jesse John avatar Jesse John avatar

Jesse is passionate about data analysis and visualization. He uses the R statistical programming language for all aspects of his work.

相关文章 - Python Iterator