我正在上一门课程,尝试查找我的问题。我不明白为什么如果输入9位数以外的内容,if
应该举起StopIteration
,然后我希望它进入except
并打印出来。有什么问题吗?
def check_id_valid(id_number):
if len(str(id_number)) != 9: raise StopIteration
else:
lst_id = list(map(int,str(id_number)))
lst_id[1::2] = map(lambda x: x * 2, lst_id[1::2])
lst_id = map(lambda x: (x % 10 + x // 10), lst_id)
num1 = sum(lst_id)
if num1 % 10 == 0:
return True
else:
return False
def id_gen(id2):
index = 0
while index < 10:
id2 += 1
if check_id_valid(id2):
index += 1
yield id2
def main():
try:
gen_idnum = id_gen(int(input("Enter id number : ")))
for n in gen_idnum:
print(n)
except StopIteration as e:
print(e)
except ValueError as e:
print(e)
if __name__ == '__main__':
main()
答案 0 :(得分:0)
将评论转换为答案,因为它显然回答了OP的问题:
不要举起StopIteration
,不要举起类似ValueError
的东西。
StopIteration
用于a very specific purpose(以允许__next__
方法表示迭代已完成),并且如您所见,将其重用于其他目的将导致问题。转换为RuntimeError
可以节省您的时间;如果Python没有做到这一点,生成器将默默地停止迭代({StopIteration
被默默吞下,导致迭代在不传播异常的情况下结束;无论如何您都不会捕获它)。