Python迭代器实现问题:仅用__iter__和next方法求除数出错
我来帮你排查这个问题~
问题根源分析
你的代码里有两个关键问题导致输出不符合预期:
- 非除数时错误返回0:在
next()方法中,你只检查当前self.divisor是否是除数,如果不是就直接返回初始值0,同时不管是否找到除数都让self.divisor +=1。这就导致遇到4、5这种非6的除数时,会输出0。 - 终止条件遗漏了整数本身:你的终止条件是
self.divisor >= self.integer,但实际上整数本身也是自己的除数(比如6的除数应该包含6),这个条件会提前终止,没处理到等于的情况。
修正后的代码
class Divisors(object): def __init__(self, integer): self.integer = integer def __iter__(self): self.divisor = 1 return self def next(self): # 循环找到下一个有效的除数 while self.divisor <= self.integer: if self.integer % self.divisor == 0: current_div = self.divisor self.divisor += 1 return current_div self.divisor += 1 # 所有数检查完毕,抛出终止迭代的异常 raise StopIteration
代码说明
- 改成循环查找下一个除数:不再只检查一次就返回,而是持续递增
self.divisor,直到找到能整除的数才返回它,避免了非除数时输出0的问题。 - 调整终止条件:只有当
self.divisor超过self.integer时才抛出StopIteration,这样就能包含整数本身这个除数。 - 测试
for i in Divisors(6): print(i),会得到预期的1 2 3 6。
小补充:如果是在Python 3环境中,迭代器的方法名应该是__next__()而不是next(),记得对应修改方法名哦。
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

