Программа Python не работает должным образом

Я попытался создать калькулятор валидности ISBN13 на основе Python, который должен работать согласно следующему фрагменту кода. Он принимает аргумент типа строка и печатает результат.

Я не понимаю, где я ошибся. В этой программе здравый смысл подсказывает мне, что 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

Как вы работаете с этим? Кроме того, что цикл не расширяется?


person Gautham Krishna    schedule 07.06.2018    source источник
comment
Почему вы проверяете num % 2, а не i % 2?   -  person Sadjad Anzabi Zadeh    schedule 07.06.2018


Ответы (2)


Ваша проблема здесь:

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 дает вам сравнение объектов, которое в общих случаях не работает.
person Prune    schedule 07.06.2018

Согласно спецификации 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 (источник), поэтому он работает в таком случае. Но в целом == больше подходит для сравнения двух чисел.

person APerson    schedule 07.06.2018