Автор оригинала: 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. Надеюсь, вам это показалось интересным. Пожалуйста, не стесняйтесь комментировать ниже, чтобы поделиться тем, как вы справились.
Счастливые вычисления.
Эта статья впервые появилась на сайте Сайт академии Компу .