如何修改ID迭代器代码,使输出仅返回有效self._id且无None值
修复IDIterator迭代器消除None输出的方案
问题原因
你的迭代器__next__方法在遇到无效ID时直接返回了None,而非继续迭代查找下一个有效ID,导致输出混入无效的None值。
修复方案
修改IDIterator的__next__方法,让它循环校验每个ID,直到找到符合check_id_valid规则的有效ID再返回;同时增加边界判断避免无限循环。
完整代码示例
保留原ID校验函数(示例逻辑,可替换为你的真实校验规则)
def check_id_valid(id_number): # 示例:9位ID校验逻辑,最后一位为校验位 id_str = str(id_number) if len(id_str) != 9: return False digits = [int(c) for c in id_str] total = sum(digits[i] * (10 - i) for i in range(8)) check_digit = (11 - (total % 11)) % 10 return digits[-1] == check_digit
修改后的IDIterator类
class IDIterator: def __init__(self, start_id): self._id = start_id def __iter__(self): return self def __next__(self): while True: current_id = self._id self._id += 1 # 设定ID上限,避免无限循环(根据实际ID规则调整) if current_id > 999999999: raise StopIteration # 校验通过则返回当前ID if check_id_valid(current_id): return current_id
测试效果
运行以下代码:
iter_obj = IDIterator(123456780) for _ in range(3): print(next(iter_obj))
输出将仅包含有效ID,不会出现None值。
核心修改说明
- 加入无限循环逻辑:持续迭代下一个ID,直到找到符合校验规则的项
- 增加边界终止条件:当ID超出设定范围时抛出
StopIteration,结束迭代 - 移除所有可能返回None的分支:确保
__next__方法要么返回有效ID,要么终止迭代
内容的提问来源于stack exchange,提问作者Idan Abramovich
相关产品推荐
相关产品推荐

