Рубрики
Без рубрики

Python Programming Challenge – Проверка номера ISBN-10

Улучшите свои навыки программирования на Python с помощью этой забавной задачи – проверьте номер ISBN 10 с помощью оператора Python modulo.

Автор оригинала: Robin Andrews.

ISBN Numbers , или International Standard Book Numbers – это коммерческие числовые идентификаторы книг, которые используются для уникальной идентификации публикации. Существует два типа номеров ISBN – ISBN-10 и ISBN-13.

Валидация – очень важная тема в компьютерном программировании, имеющая множество приложений. В этой статье мы рассмотрим проблему проверки правильности номера ISBN 10 .

Правило состоит в том, что для того, чтобы номер ISBN 10 был действительным, мы умножаем первую цифру на 10 , второй по 9 , третий по 8 и т. Д. вплоть до 10-й цифры по 1 . Если результат делится на 11 тогда код действителен (по крайней мере, численно – может не быть книги с определенным численно действительным кодом..)

Валидация номеров ISBN 10

Посмотрите на этот пример:

Номер ISBN-10: 0553418025

(10 * 0) + (9 * 5) + (8 * 5) + (7 * 3) + (6 * 4) + (5 * 1) + (4 * 8) + (3 * 0) + (2 * 2) + (1 *

176 %

Поскольку 176 % , мы знаем, что 176 является кратным 11 таким образом, номер ISBN-10 действителен.

Одна дополнительная деталь заключается в том, что последним символом чисел ISBN 10 может быть X . При проверке валидности кода этот X интерпретируется как имеющий значение 10 .

Оператор по модулю в Python

Ключом здесь является делимость на 11 . Мы можем проверить это свойство в Python с помощью оператора modulo (%) . Если вы не знакомы с оператором*modulo, то сейчас самое время узнать об этом. Он имеет много важных применений в программировании.

Оператор по модулю дает остаток при делении на целое число.

Например 10 % потому что

10 * 3 + 1

В качестве примера его полезности, чтобы проверить, является ли число четным или нечетным, мы можем сделать следующее:

for i in range(21):
    print(f"{i} is {'even' if i % 2 == 0 else 'odd'}")

(Там есть пара удобных ярлыков Python – f-strings для интерполяции переменных и Python тернарный условный оператор .)

Функция Python для проверки номеров ISBN 10

Теперь попробуйте выполнить приведенную ниже функцию для проверки или проверки номеров ISBN 10. Я включил некоторые базовые тесты в виде утверждений, чтобы вы могли четко представлять, какой результат ожидается для данного входного сигнала. В этой первой версии не беспокойтесь о X для последней цифры вопроса – мы придем к этому немного позже.

def validate_isbn10(code_string):
    pass


isbn = "123"
assert validate_isbn10(isbn) is False
isbn = "0136091814"
assert validate_isbn10(isbn) is True
isbn = "1616550416"
assert validate_isbn10(isbn) is False
isbn = "0553418025"
assert validate_isbn10(isbn) is True
isbn = "3859574859"
assert validate_isbn10(isbn) is False

Если вы чувствуете, что вам нужно немного больше структуры, вот версия заглушки с комментариями, которые помогут вам

def validate_isbn10(code_string):
    # Make sure string argument is 10 chars long.

    # Initialise result to 0
    result = 0

    # Iterate through code_string

        # for each character, multiply by a different decreasing number: 10 - x


    print(result)  # For debugging if required

    # Return whether the isbn is valid as a Boolean

Вы можете увидеть мое решение ниже.

def validate_isbn10(code_string):
    # Make sure string argument is 10 chars long.
    if len(code_string) != 10:
        return False

    # Initialise result to 0
    result = 0

    # Iterate through code_string
    for x in range(10):
        # for each character, multiply by a different decreasing number: 10 - x
        result = result + int(code_string[x]) * (10 - x)

    print(result)  # For debugging if required

    # Return whether the isbn is valid
    if result % 11 == 0:
        return True
    else:
        return False

    # If you prefer and understand why it is equivalent
    # return result % 11 == 0

Это нормально для базового решения. Однако есть возможности для улучшения. Во-первых, нам нужно обработать случай, когда X для последней цифры, но также есть некоторые другие детали, такие как удаление пробелов и тире, так что ISBN-10, такой как 1-55404-295-X , будет считаться действительным, поскольку именно так они часто появляются.

Python Улучшенное решение для проверки номера ISBN-10

Приведенная ниже версия содержит несколько улучшений базового решения, приведенного выше. Это зависит от вас, хотите ли вы попробовать реализовать улучшенную версию самостоятельно или просто посмотрите на версию ниже, чтобы узнать, как это можно сделать.

def validate_isbn10(code_string):
    # Strip spaces and dashes
    code_string = code_string.replace("-", "").replace(" ", "")
    # Make sure string argument is valid
    if len(code_string) != 10:
        return False
    if not code_string[0:8].isdigit() or not (code_string[9].isdigit() or code_string[9].lower() == "x"):
        return False

    # Initialise result to 0
    result = 0

    # Iterate through code_string
    for i in range(9):
        # for each character, multiply by a different decreasing number: 10 - x
        result = result + int(code_string[i]) * (10 - i)

    # Handle last character
    if code_string[9].lower() == "x":
        result += 10
    else:
        result += int(code_string[9])

    print(result)  # For debugging if required

    # Return whether the isbn is valid
    if result % 11 == 0:
        return True
    else:
        return False

    # If you prefer and understand why it is equivalent
    # return result % 11 == 0


isbn = "123"
assert validate_isbn10(isbn) is False
isbn = "abc"
assert validate_isbn10(isbn) is False
isbn = "0136091814"
assert validate_isbn10(isbn) is True
isbn = "1616550416"
assert validate_isbn10(isbn) is False
isbn = "0553418025"
assert validate_isbn10(isbn) is True
isbn = "3859574859"
assert validate_isbn10(isbn) is False
isbn = "1-55404-295-X"
assert validate_isbn10(isbn) is True

В этой статье мы рассмотрели проблему написания функции Python для проверки номера ISBN-10. Надеюсь, вам это показалось интересным. Пожалуйста, не стесняйтесь комментировать ниже, чтобы поделиться тем, как вы справились.

Счастливые вычисления.

Эта статья впервые появилась на сайте Сайт академии Компу .