ISBN Checker — проверка ввода пользователя

Итак, моя задача состоит в том, чтобы проверить ввод пользователя для каждой из 10 цифр ISBN, которые он вводит. Мне нужно убедиться, что 1) пользовательский ввод не пуст, 2) пользовательский ввод - это только целое число (что я и сделал) и 3) что они вводят только ОДНУ цифру.

Извините, я видел несколько похожих вопросов по этому поводу, но я хотел сохранить оператор try-except (если возможно), чтобы подобные вопросы не были слишком полезными.

Как я могу проверить против пустых входных данных и что введена только одна цифра?

Вот код:

print("You will be asked to enter an ISBN-10 Number. Please enter it digit by digit.")
ISBN10NumberList = []
ISBN10NumberAdder = 0
for count in range (10):
  validInput1 = True
  if (count <= 8):
    while validInput1 != False:
      try:
        ISBN10NumberList.append(int(input("Please enter the ISBN digit: ")))
        validInput1 = False
      except ValueError:
        print("That is not a valid input! Please enter a integer only.")


  elif (count == 9):
      CheckDigit10 = input("Please enter the ISBN digit: ")
      print("")
      if CheckDigit10 == "X" or CheckDigit10 == "x":
          CheckDigit10 = 10

for count in range (0, 9):
    ISBN10NumberAdder += int(ISBN10NumberList[count]) * (10 - count)

CheckDigit10 = int(CheckDigit10)
CheckingCheckDigit = 11-(ISBN10NumberAdder % 11)

if (CheckDigit10 == CheckingCheckDigit):
    print("This is a valid ISBN!")
else:
    print("This is not a valid ISBN!")

person electricbl00    schedule 05.02.2015    source источник
comment
Вводить цифру за цифрой? Что это за шаблон, программирование садизмом?   -  person Ignacio Vazquez-Abrams    schedule 06.02.2015
comment
У Игнасио отличный момент. Почему бы не взять весь ввод (в виде строки), перебрать его символ за символом, чтобы выполнить проверку работоспособности, а затем выполнить проверку достоверности в конце?   -  person MattDMo    schedule 06.02.2015
comment
Было бы проще? Как мне это сделать?   -  person electricbl00    schedule 06.02.2015
comment
Это похоже на работу для регулярных выражений.   -  person Kevin    schedule 06.02.2015


Ответы (1)


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

В основном цикле пользователю будет неоднократно предлагаться ввести ISBN, пока он не введет действительный номер.

def verify_check(isbn_str):
    last = isbn_str[-1] # Last character
    if last == 'X':
        check = 10
    else:
        check = int(last)
    # This part was fine in your original:
    adder = 0
    for count in range(9):
        adder += int(isbn_str[count]) * (10 - count)
    if adder % 11 != check:
         raise ValueError("Checksum failed")

def verify_isbn10(isbn_str):
    if len(isbn_str) != 10:
        raise ValueError("ISBN must be 10 digits long")

    # Check that the first nine chars are digits
    for char in isbn_str[:-1]:
        if not char.isdigit():
            raise ValueError("ISBN must contain digits or X")

    # Special case for the last char
    if not (isbn_str[-1].isdigit or isbn_str[-1] == "X"):
        raise ValueError("ISBN must contain digits or X")
     verify_check(isbn_str)


# Main code:
while 1:
    try:
        isbn_str = raw_input("Enter ISBN: ")
        verify_isbn(isbn_str)
        break
    except ValueError as e:
        print "Whoops:", e
# At this point, isbn_str contains a valid ISBN

Если вы хотите воспользоваться предложением Кевина и попробовать свои силы в регулярных выражениях, вы можете использовать что-то вроде следующей замены для verify_isbn10. Обратите внимание, что это не объясняет пользователю, что именно было не так.

import re
isbn_re = re.compile(r"""
     ^      #Start of string
     [0-9]{9}   # Match exactly 9 digits
     [0-9X]     # Match a digit or X for the check digit
     $            # Match end of string
     """, re.VERBOSE)

def verify_isbn10(isbn_str):
    m = isbn_re.match(isbn_str)
    if m is None:  #User didn't enter a valid ISBN
        raise ValueError("Not a valid ISBN")
    verify_check(isbn_str)
person Gretchen    schedule 05.02.2015