Python迭代器与生成器

Python 迭代器和生成器

Python 中的迭代器和生成器是用于处理可迭代对象的强大工具。它们有一些共同点,但也有一些重要的区别。

迭代器(Iterators)

  • 迭代器是可迭代对象的一个子集。
  • 它是一个可以记住遍历位置的对象。
  • 迭代器需要实现 __iter__()__next__() 方法。
  • 使用 iter() 方法可以将列表、元组、集合、字符串等可迭代对象转换为迭代器。
  • 通过调用 next() 方法逐个访问元素。
  • 不能通过索引来访问生成器的元素。
  • 当没有更多元素可迭代时,next() 方法会引发 StopIteration 异常。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建一个可迭代对象(列表)
my_list = [1, 2, 3, 4, 5]

# 使用iter()方法将可迭代对象转换为迭代器
my_iterator = iter(my_list)

# 使用next()方法逐个访问迭代器的元素
try:
while True:
element = next(my_iterator)
print(element)
except StopIteration:
pass

在这个示例中,将列表my_list转换为迭代器my_iterator,然后使用next()方法逐个访问迭代器的元素。当没有更多的元素可迭代时,next()方法会引发StopIteration异常,我们通过异常处理来结束循环。

生成器(Generators)

  • 生成器是一种特殊的迭代器。
  • 使用 yield 关键字替代 return 返回值,将函数变成生成器对象。
  • 生成器不会一次性生成所有值,而是按需生成每个值,这可以节省内存。
  • 生成器只能被迭代一次,一旦耗尽,需要重新创建或重新初始化才能再次迭代。
  • 不能通过索引来访问生成器的元素。

生成器是生成元素的,迭代器是访问集合元素的一种方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建一个生成器函数
def my_generator():
yield 1
yield 2
yield 3

# 使用生成器函数创建生成器对象
gen = my_generator()

# 迭代生成器并按需生成值
for value in gen:
print(value)

# 尝试再次迭代,会发现生成器已经耗尽
for value in gen:
print(value) # 不会打印任何内容,因为生成器已经耗尽

迭代器用于按需访问集合元素,而生成器用于按需生成元素


:D 一言句子获取中...