RuntimeError:生成器引发StopIteration

时间:2020-07-29 14:20:53

标签: python python-3.x

我正在上一门课程,尝试查找我的问题。我不明白为什么如果输入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()

1 个答案:

答案 0 :(得分:0)

将评论转换为答案,因为它显然回答了OP的问题:

不要举起StopIteration,不要举起类似ValueError的东西。

StopIteration用于a very specific purpose(以允许__next__方法表示迭代已完成),并且如您所见,将其重用于其他目的将导致问题。转换为RuntimeError可以节省您的时间;如果Python没有做到这一点,生成器将默默地停止迭代({StopIteration被默默吞下,导致迭代在不传播异常的情况下结束;无论如何您都不会捕获它)。