Программа Python не работает должным образом - PullRequest
0 голосов
/ 07 июня 2018

Я пытался создать основанный на 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 голосов
/ 07 июня 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 ( source ), чтоВот почему это работает в этом случае.Но в целом == больше подходит для сравнения двух чисел.

0 голосов
/ 07 июня 2018

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

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