Python程序无法按预期工作

时间:2018-06-07 18:16:25

标签: python python-3.x isbn

我尝试创建一个基于python的ISBN13有效性计算器,它应该根据以下代码片段工作。它接受一个string类型的参数并打印结果。

我不明白我在哪里错了,在这个程序中,常识告诉我num将会给出3或1。

def isbncheck(isbn):
    num = int(0)
    for i in range(0,12):
        if num % 2 is 1:
            num = num + (int(isbn[i])*3)
            print(isbn[i] + " * 3 + at i=" + str(i))
        elif num % 2 is 0:
            num = num + (int(isbn[i]))
            print(isbn[i] + " * 1 + at i=" + str(i))
        else:
            print("Unhandled Exception.")

    print("_"*7)
    print(num)
    num = num%10
    print(num)
    print(isbn[12])
    print(int(isbn[12]))
    if num != int(isbn[12]):
        print("This is not valid")
    else:
        print("It is Valid.")

print(isbncheck("9788177000252"))

我期望输出到替代因子1和3.相反,我得到了这个:

9 * 1 + at i=0
7 * 3 + at i=1
8 * 1 + at i=2
8 * 1 + at i=3
1 * 1 + at i=4
7 * 3 + at i=5
7 * 1 + at i=6
0 * 3 + at i=7
0 * 3 + at i=8
0 * 3 + at i=9
2 * 3 + at i=10
5 * 3 + at i=11
_______
96
6
2
2
This is not valid
None

你是如何解决这个问题的?除了不扩展循环?

2 个答案:

答案 0 :(得分:1)

你的问题在这里:

for i in range(0,12):
    if num % 2 is 1:

num是您的累计金额。您必须检查索引,而不是目前为止的总和。

for i in range(len(isbn)):
    digit = int(isbn[i])
    if i % 2 == 1:
        num += 3 * digit

还要注意一些小的改进:

  • 由于您必须两次引用该值,转换为int并将其保留在临时digit中。
  • 使用==进行数值比较; is为您提供对象比较,对于一般情况,这将会失败。

答案 1 :(得分:0)

根据ISBN规范,3除了每个其他数字,因此您的if语句应为if i % 2 is 1:,而不是if num % 2 is 1:(并且应相应地更改elif)。

此外,你必须取10减去模运算的结果;所以在num = num%10之后你会有新的行num = 10 - num。否则,您的计算校验位(num)将不正确。

另一个注意事项:is仅适用于某些实现,以比较-1到256之间的数字(source),这就是为什么它适用于这种情况。但总的来说==更适合比较两个数字。