生成器和迭代器是 Python 中非常重要的概念,它们可以帮助你更高效地处理数据。今天我们就来聊聊这 8 个核心概念,一步步带你从基础到高级。
1. 迭代器(Iterator)
概念:迭代器是一个可以记住遍历位置的对象。它从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
创建方式:
- 使用 iter() 函数将一个可迭代对象转换为迭代器。
- 使用 next() 函数获取迭代器的下一个元素。
示例:
# 创建一个列表
my_list = [1, 2, 3, 4, 5]
# 将列表转换为迭代器
my_iterator = iter(my_list)
# 获取迭代器的下一个元素
print(next(my_iterator)) # 输出: 1
print(next(my_iterator)) # 输出: 2
# 遍历迭代器
for item in my_iterator:
print(item) # 输出: 3, 4, 5
2. 可迭代对象(Iterable)
概念:可迭代对象是可以返回迭代器的任何对象。常见的可迭代对象包括列表、元组、字典、集合等。
示例:
# 列表是一个可迭代对象
my_list = [1, 2, 3, 4, 5]
# 使用 for 循环遍历可迭代对象
for item in my_list:
print(item) # 输出: 1, 2, 3, 4, 5
3. 生成器(Generator)
概念:生成器是一种特殊的迭代器,它使用 yield 关键字来生成值。生成器函数在每次调用时会暂停并保存当前状态,下次调用时从上次暂停的地方继续执行。
创建方式:
- 使用 yield 关键字定义生成器函数。
- 使用生成器表达式。
示例:
# 定义一个生成器函数
def simple_generator():
yield 1
yield 2
yield 3
# 调用生成器函数
gen = simple_generator()
# 获取生成器的下一个元素
print(next(gen)) # 输出: 1
print(next(gen)) # 输出: 2
print(next(gen)) # 输出: 3
# 使用生成器表达式
gen_expr = (x for x in range(5))
# 遍历生成器表达式
for item in gen_expr:
print(item) # 输出: 0, 1, 2, 3, 4
4. 生成器表达式(Generator Expression)
概念:生成器表达式类似于列表推导式,但返回的是一个生成器对象,而不是列表。生成器表达式更加节省内存。
示例:
# 列表推导式
list_comp = [x for x in range(10)]
print(list_comp) # 输出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 生成器表达式
gen_expr = (x for x in range(10))
# 遍历生成器表达式
for item in gen_expr:
print(item) # 输出: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
5. send() 方法
概念:send() 方法可以向生成器发送一个值,并恢复生成器的执行。这个值会成为 yield 表达式的值。
示例:
def echo():
while True:
received = yield
print(f"Received: {received}")
# 创建生成器
gen = echo()
# 初始化生成器
next(gen)
# 发送值
gen.send("Hello") # 输出: Received: Hello
gen.send("World") # 输出: Received: World
6. throw() 和 close() 方法
概念:
- throw() 方法用于在生成器内部抛出一个异常。
- close() 方法用于关闭生成器。
示例:
def simple_generator():
try:
yield 1
yield 2
yield 3
except ValueError:
print("ValueError caught")
# 创建生成器
gen = simple_generator()
# 获取生成器的下一个元素
print(next(gen)) # 输出: 1
# 抛出异常
gen.throw(ValueError) # 输出: ValueError caught
# 关闭生成器
gen.close()
7. 生成器委托(Generator Delegation)
概念:生成器委托允许一个生成器委托另一个生成器的执行。使用 yield from 语法可以实现这一点。
示例:
def sub_generator():
yield "Sub 1"
yield "Sub 2"
def main_generator():
yield "Main 1"
yield from sub_generator()
yield "Main 2"
# 创建主生成器
gen = main_generator()
# 遍历主生成器
for item in gen:
print(item) # 输出: Main 1, Sub 1, Sub 2, Main 2
8. 无限生成器
概念:无限生成器是指可以无限生成值的生成器。通常使用 while True 循环来实现。
示例:
def infinite_generator():
i = 0
while True:
yield i
i += 1
# 创建无限生成器
gen = infinite_generator()
# 获取前 5 个生成的值
for _ in range(5):
print(next(gen)) # 输出: 0, 1, 2, 3, 4
实战案例:生成斐波那契数列
问题描述:斐波那契数列是一个经典的数列,每个数是前两个数的和。我们可以使用生成器来生成斐波那契数列。
实现代码:
def fibonacci(n):
a, b = 0, 1
count = 0
while count < n:
yield a
a, b = b, a + b
count += 1
# 生成前 10 个斐波那契数
fib_gen = fibonacci(10)
# 打印生成的斐波那契数
for num in fib_gen:
print(num) # 输出: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
总结
本文介绍了 Python 中生成器和迭代器的 8 个核心概念,包括迭代器、可迭代对象、生成器、生成器表达式、send() 方法、throw() 和 close() 方法、生成器委托以及无限生成器。通过具体的代码示例,我们逐步展示了每个概念的应用方法。