🚀 迭代器和生成器练习
迭代器和生成器是Python中处理数据流的强大工具!通过这组练习,你将能够熟练运用迭代器和生成器来编写更高效、更优雅的代码。准备好了吗?让我们开始吧!
📝 练习目标
- 理解迭代器协议的工作原理
- 能够创建自定义迭代器类
- 掌握生成器函数的编写方法
- 熟练使用生成器表达式
- 能够在实际场景中应用迭代器和生成器
🌱 基础练习
1. 自定义倒计时迭代器
创建一个名为CountdownIterator的迭代器类,用于实现倒计时功能。该迭代器应该从给定的起始数字开始,每次返回当前数字并将其减1,直到达到0。
要求:
- 实现
__iter__和__next__方法 - 当倒计时结束时,抛出
StopIteration异常
示例:
# 创建一个从5开始倒计时的迭代器
countdown = CountdownIterator(5)
for num in countdown:
print(num)
# 输出:
# 5
# 4
# 3
# 2
# 1
# 0参考答案提示: 在__next__方法中检查当前值是否大于等于0,如果是则返回当前值并减1,否则抛出StopIteration异常。
2. 生成器函数:偶数生成器
编写一个生成器函数even_numbers(start, end),用于生成从start到end(包括end)之间的所有偶数。
示例:
# 生成1到10之间的所有偶数
evens = even_numbers(1, 10)
for num in evens:
print(num, end=" ")
# 输出:2 4 6 8 10参考答案提示: 使用yield语句来产生符合条件的偶数。
3. 生成器表达式:平方数生成器
使用生成器表达式创建一个生成器,用于生成1到20之间所有数字的平方。
示例:
# 创建平方数生成器
squares = # 生成器表达式
for square in squares:
print(square, end=" ")
# 输出:1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400参考答案提示: 生成器表达式的语法类似于列表推导式,但使用圆括号。
4. 自定义迭代器:等差数列
创建一个名为ArithmeticSequence的迭代器类,用于生成等差数列。该迭代器应该接受起始值start、公差step和项数count作为参数。
示例:
# 创建一个起始值为2,公差为3,共5项的等差数列迭代器
arithmetic = ArithmeticSequence(2, 3, 5)
for num in arithmetic:
print(num, end=" ")
# 输出:2 5 8 11 14参考答案提示: 在__next__方法中计算下一个项,并跟踪已生成的项数。
5. 生成器函数:斐波那契数列
编写一个生成器函数fibonacci(max_count),用于生成斐波那契数列的前max_count项。斐波那契数列的定义是:前两项为0和1,后续每项都是前两项之和。
示例:
# 生成斐波那契数列的前10项
fib = fibonacci(10)
for num in fib:
print(num, end=" ")
# 输出:0 1 1 2 3 5 8 13 21 34参考答案提示: 使用两个变量来跟踪前两个数,并在循环中更新它们。
🚀 挑战练习
6. 无限序列生成器
编写一个生成器函数infinite_counter(start=0, step=1),用于生成一个无限递增的序列。该生成器应该从start开始,每次增加step。
要求:
- 由于这是一个无限序列,用户需要通过其他方式(如循环次数限制)来停止迭代
示例:
# 创建一个从10开始,步长为2的无限计数器
counter = infinite_counter(10, 2)
# 只获取前5个值
for i in range(5):
print(next(counter), end=" ")
# 输出:10 12 14 16 18参考答案提示: 使用无限循环(while True)和yield语句。
7. 文件读取生成器
编写一个生成器函数read_file_by_lines(file_path),用于逐行读取文件内容。该生成器应该每次返回文件的一行,直到文件结束。
要求:
- 处理文件不存在的情况
- 确保文件正确关闭
示例:
# 假设存在一个名为"sample.txt"的文件
for line in read_file_by_lines("sample.txt"):
print(line.strip())
# 输出文件的每一行内容参考答案提示: 使用with语句和for循环遍历文件对象。
8. 数据处理管道
创建一个简单的数据处理管道,由多个生成器函数组成。具体来说,实现以下三个生成器函数:
read_numbers(file_path): 从文件中读取数字(每行一个数字)filter_positive(numbers): 过滤出正数calculate_squares(numbers): 计算每个数字的平方
然后将这些生成器组合成一个数据处理管道。
示例:
# 创建数据处理管道
pipeline = calculate_squares(filter_positive(read_numbers("numbers.txt")))
# 使用管道
for square in pipeline:
print(square, end=" ")
# 输出:文件中所有正数的平方参考答案提示: 每个生成器函数接收一个迭代器作为输入,并产生处理后的值。
💡 部分参考答案
1. 自定义倒计时迭代器
class CountdownIterator:
def __init__(self, start):
self.start = start
self.current = start
def __iter__(self):
return self
def __next__(self):
if self.current < 0:
raise StopIteration
value = self.current
self.current -= 1
return value2. 生成器函数:偶数生成器
def even_numbers(start, end):
# 调整起始值,确保是偶数
if start % 2 != 0:
start += 1
# 生成从start到end的所有偶数
for num in range(start, end + 1, 2):
yield num3. 生成器表达式:平方数生成器
squares = (x**2 for x in range(1, 21))4. 自定义迭代器:等差数列
class ArithmeticSequence:
def __init__(self, start, step, count):
self.start = start
self.step = step
self.count = count
self.current_count = 0
self.current_value = start
def __iter__(self):
return self
def __next__(self):
if self.current_count >= self.count:
raise StopIteration
value = self.current_value
self.current_value += self.step
self.current_count += 1
return value5. 生成器函数:斐波那契数列
def fibonacci(max_count):
if max_count <= 0:
return
a, b = 0, 1
count = 0
while count < max_count:
yield a
a, b = b, a + b
count += 1📚 扩展阅读
🎉 恭喜你完成了迭代器和生成器的练习!这些工具是Python中处理数据流的强大武器,掌握它们将帮助你编写更高效、更优雅的代码。在实际项目中,尤其是处理大型数据或需要惰性求值的场景,迭代器和生成器会是你的得力助手。继续加油! 💪




