练习题:生成器与迭代器

考点:

  • 生成器的定义和使用
  • 迭代器的使用
  • yield 关键字

题目描述: 编写一个Python生成器函数 number_sequence,该函数接受两个参数 startend,并生成从 startend(包含 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值