Python 中迭代器和生成器的区别
Jesse John
2023年1月30日
迭代器和生成器帮助我们生成一些输出或迭代地处理一些代码,一次一位。在本文中,我们将通过一个简单的示例了解 Python 的迭代器和生成器之间的一些基本区别。
Python 中的迭代器
迭代器的基本特征如下:
- 迭代器是使用实现迭代器协议的类创建的对象。这意味着该类定义了
__iter__
和__next__
方法。 __next__
方法使用return
语句返回一个值。由于return
语句必须是该方法的最后一行,我们必须在return
语句之前更新要在__next__
下一次运行中使用的变量。
在最简单的情况下,我们将看到,__iter__
返回 self
。
Python 中的生成器
生成器的基本特征如下:
- 生成器是一个函数。
- 生成器函数使用
yield
关键字而不是return
关键字。
2.1yield
关键字产生一个值并暂停函数的执行。
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__
方法编写自定义代码。
有关详细信息,请参阅以下内容。
作者: Jesse John