Python 迭代器与生成器
Python 中的迭代器和生成器是用于遍历和生成数据的强大工具,它们能够高效地处理大量数据或复杂的迭代任务。
1. 迭代器的概念与使用
迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器的特点:
- 实现了
__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
2. 生成器的使用
生成器是简化了迭代器的定义,它使用 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
3. 列表生成式与生成器表达式
列表生成式(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
4. 迭代器与生成器的应用场景
- 迭代器:适合用于实现更复杂的迭代逻辑,比如自定义迭代规则或需要在多处重复使用的迭代逻辑。
- 生成器:适合用于生成大量数据时节省内存,或需要逐步生成数据、数据流式处理的场景。
总结
- 迭代器 通过实现
__iter__()
和__next__()
方法,自定义遍历行为,适用于需要自定义迭代逻辑的场景。 - 生成器 使用
yield
关键字简化了迭代器的实现,更适合生成序列或流式数据。 - 列表生成式 和 生成器表达式 提供了简洁的语法用于创建列表和生成器,生成器表达式尤其适合处理大数据量或节省内存的场景。