Python(15)迭代器和生成器
在 Python 编程领域中,迭代器和生成器是两个强大且独特的概念,它们为处理数据序列提供了高效且灵活的方式。这篇博客将结合菜鸟教程内容,通过丰富的代码示例,深入学习 Python3 中的迭代器与生成器知识,方便日后复习回顾。
一、迭代器
1.1 迭代器基础概念
迭代是 Python 中访问集合元素的重要方式,而迭代器则是实现这一过程的关键对象。迭代器可以记住遍历的位置,从集合的第一个元素开始访问,直到所有元素访问完毕,且只能往前移动。像字符串、列表、元组这些常见的数据类型,都能用来创建迭代器。例如:
my_list = [10, 20, 30, 40]
my_iter = iter(my_list)
print(next(my_iter))
print(next(my_iter))
上述代码中,先使用iter()
函数将列表my_list
转换为迭代器对象my_iter
,然后通过next()
函数逐个获取迭代器中的元素,依次输出10
和20
。
1.2 使用 for 语句遍历迭代器
除了用next()
函数,还能借助常规的for
语句遍历迭代器。示例如下:
my_list = [5, 10, 15, 20]
my_iter = iter(my_list)
for num in my_iter:print(num, end=" ")
在这段代码里,for
循环会自动调用迭代器的next()
函数,直到迭代结束,输出结果为5 10 15 20
。这种方式更为简洁直观,在实际编程中使用频率很高。
1.3 使用 while 循环结合 next () 函数遍历迭代器
利用while
循环和next()
函数也能实现对迭代器的遍历,不过需要处理StopIteration
异常来避免无限循环。示例代码如下:
import sys
my_list = [1, 2, 3]
my_iter = iter(my_list)
while True:try:print(next(my_iter))except StopIteration:sys.exit()
在这个例子中,while
循环持续调用next()
函数获取迭代器中的元素,当迭代结束时,会抛出StopIteration
异常,通过except
语句捕获该异常并使用sys.exit()
退出程序。
1.4 创建自定义迭代器
创建自定义迭代器,需要在类中实现__iter__()
和__next__()
方法。以创建一个从指定数字开始逐步递增的迭代器为例:
class IncrementIterator:def __init__(self, start=1):self.current = startdef __iter__(self):return selfdef __next__(self):value = self.currentself.current += 1return valuemy_iter = IncrementIterator(3)
print(next(my_iter))
print(next(my_iter))
在上述代码中,IncrementIterator
类实现了迭代器协议。__init__()
方法用于初始化迭代器的起始值,__iter__()
方法返回迭代器对象本身,__next__()
方法返回当前值并将其递增。运行代码后,依次输出3
和4
。
还可以设置迭代的终止条件。比如,让迭代器在达到某个上限时停止:
class LimitedIncrementIterator:def __init__(self, start=1, limit=5):self.current = startself.limit = limitdef __iter__(self):return selfdef __next__(self):if self.current > self.limit:raise StopIterationvalue = self.currentself.current += 1return valuemy_iter = LimitedIncrementIterator(2, 6)
for num in my_iter:print(num)
在这个示例中,LimitedIncrementIterator
类增加了一个终止条件。__next__()
方法会检查当前值是否超过上限limit
,如果超过则抛出StopIteration
异常,从而结束迭代。运行代码后,会输出2
、3
、4
、5
、6
。
二、生成器
2.1 生成器基础概念
在 Python 中,使用yield
关键字的函数就是生成器函数,调用生成器函数会返回一个迭代器对象。生成器函数的独特之处在于,它可以在迭代过程中逐步产生值,而不是一次性返回所有结果,这在处理大量数据时能有效节省内存。例如,创建一个简单的生成器函数,用于生成从某个数开始递减的序列:
def decreasing_sequence(start):while start > 0:yield startstart -= 1my_generator = decreasing_sequence(4)
print(next(my_generator))
print(next(my_generator))
在这段代码中,decreasing_sequence
是生成器函数,yield
语句使函数暂停执行并返回当前的start
值。每次调用next()
函数时,函数会从上次暂停的地方继续执行。运行代码后,依次输出4
和3
。
2.2 使用 for 循环遍历生成器
使用for
循环遍历生成器非常方便,for
循环会自动处理StopIteration
异常。示例如下:
def number_generator():for num in range(1, 4):yield numgen = number_generator()
for value in gen:print(value)
在这个例子中,number_generator
生成器函数生成 1 到 3 的数字。for
循环遍历生成器,依次输出1
、2
、3
。
2.3 生成器实现斐波那契数列
斐波那契数列是一个经典的数学序列,利用生成器可以简洁地实现。示例代码如下:
def fibonacci_generator(n):a, b = 0, 1count = 0while True:if count > n:returnyield aa, b = b, a + bcount += 1fib_gen = fibonacci_generator(7)
for _ in range(8):print(next(fib_gen), end=" ")
在这段代码中,fibonacci_generator
是生成斐波那契数列的生成器函数。yield
语句每次返回当前的斐波那契数,函数会在下次调用时继续计算下一个数。运行代码后,会输出斐波那契数列的前 8 项:0 1 1 2 3 5 8 13
。
三、总结
Python3 的迭代器和生成器为数据处理提供了强大的支持。迭代器通过实现__iter__()
和__next__()
方法,为遍历数据序列提供了统一的接口;生成器则借助yield
关键字,以一种高效、节省内存的方式生成数据序列。在实际编程中,合理运用迭代器和生成器,能够优化代码结构,提高程序的性能。希望这篇博客能帮助你更好地复习和巩固迭代器与生成器的知识,在编程实践中灵活运用它们解决各种问题。