Python 中的迭代器和生成器是用于遍历和生成数据的强大工具,它们能够高效地处理大量数据或复杂的迭代任务。
迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
__iter__()
和 __next__()
方法:迭代器对象实现了这两个方法,因此可以用于 for
循环或手动调用 next()
进行遍历。next()
时,返回一个元素,直到没有元素为止抛出 StopIteration
异常。任何实现了 __iter__()
和 __next__()
方法的对象都是一个迭代器。你可以通过实现这些方法来自定义一个迭代器。
class MyIterator:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.current < self.end:
value = self.current
self.current += 1
return value
else:
raise StopIteration
# 使用自定义迭代器
it = MyIterator(1, 5)
for num in it:
print(num) # 输出 1, 2, 3, 4
生成器是简化了迭代器的定义,它使用 yield
关键字来生成一个元素,每次调用 next()
时,生成器会从上次 yield
语句暂停的地方恢复执行,并继续生成下一个值。
yield
关键字,而不需要 __iter__()
和 __next__()
方法。def my_generator(start, end):
current = start
while current < end:
yield current
current += 1
# 使用生成器
gen = my_generator(1, 5)
for num in gen:
print(num) # 输出 1, 2, 3, 4
列表生成式(List Comprehensions)是一种简洁的创建列表的方式,适用于简单的过滤和变换操作。
生成器表达式与列表生成式类似,但生成器表达式返回的是一个生成器对象,而不是列表,生成器表达式是惰性求值的,更节省内存。
# 创建一个包含 1 到 4 的平方的列表
squares = [x**2 for x in range(1, 5)]
print(squares) # 输出 [1, 4, 9, 16]
# 使用生成器表达式生成 1 到 4 的平方
squares_gen = (x**2 for x in range(1, 5))
# 生成器表达式使用 for 循环遍历
for num in squares_gen:
print(num) # 输出 1, 4, 9, 16
__iter__()
和 __next__()
方法,自定义遍历行为,适用于需要自定义迭代逻辑的场景。yield
关键字简化了迭代器的实现,更适合生成序列或流式数据。