考点:
- 生成器的定义和使用
- 迭代器的使用
yield
关键字
题目描述: 编写一个Python生成器函数 number_sequence
,该函数接受两个参数 start
和 end
,并生成从 start
到 end
(包含 end
)的整数序列。然后,编写一个函数 sum_sequence
,该函数接受一个生成器作为参数,并返回该生成器生成的数字序列的总和。
作答区:
# 请在此处编写你的代码
答案
def number_sequence(start, end):
current = start
while current <= end:
yield current
current += 1
def sum_sequence(generator):
total = 0
for number in generator:
total += number
return total
# 测试代码
sequence = number_sequence(1, 10)
print(sum_sequence(sequence)) # 输出应为 55
扩展1:增加功能
扩展描述: 修改 number_sequence
生成器函数,增加一个可选参数 step
,允许用户指定生成序列的步长。默认步长为1。同时,确保 sum_sequence
函数能够处理新的生成器。
作答区:
# 请在此处编写你的代码
答案:
def number_sequence(start, end, step=1):
if start > end and step > 0:
raise ValueError("Start cannot be greater than end when step is positive.")
current = start
while (step > 0 and current <= end) or (step < 0 and current >= end):
yield current
current += step
def sum_sequence(generator):
total = 0
for number in generator:
total += number
return total
# 测试代码
sequence = number_sequence(1, 10, 2)
print(sum_sequence(sequence)) # 输出应为 25 (1+3+5+7+9)
扩展2:错误处理
扩展描述: 在 number_sequence
函数中增加错误处理,确保当 start
大于 end
时抛出一个 ValueError
异常。在 sum_sequence
函数中捕获并处理这个异常。
答案:
def number_sequence(start, end, step=1):
if start > end and step > 0:
raise ValueError("Start cannot be greater than end when step is positive.")
current = start
while (step > 0 and current <= end) or (step < 0 and current >= end):
yield current
current += step
def sum_sequence(generator):
total = 0
try:
for number in generator:
total += number
except ValueError as e:
print(f"Error: {e}")
return total
# 测试代码
try:
sequence = number_sequence(10, 1, 1)
print(sum_sequence(sequence))
except ValueError as e:
print(f"Caught an error: {e}")
扩展3:自定义迭代器类
扩展描述: 创建一个自定义迭代器类 NumberSequenceIterator
,该类实现迭代器协议,并提供与 number_sequence
生成器相同的功能。
答案:
class NumberSequenceIterator:
def __init__(self, start, end, step=1):
self.start = start
self.end = end
self.step = step
self.current = start
def __iter__(self):
return self
def __next__(self):
if (self.step > 0 and self.current > self.end) or (self.step < 0 and self.current < self.end):
raise StopIteration
else:
result = self.current
self.current += self.step
return result
def sum_sequence(iterator):
total = 0
for number in iterator:
total += number
return total
www.wwmqrcw.com
www.wwglrcw.com
www.wwtzrcw.com
www.zygzrcw.com
www.zysnrcw.com
# 测试代码
sequence_iterator = NumberSequenceIterator(1, 10, 2)
print(sum_sequence(sequence_iterator)) # 输出应为 25