我正在制作ISBN校验位计划。但是,虽然我已经使我的程序只接受长度为10的值,但是如果输入10个字母,它将会崩溃。
有谁知道如何解决这个问题?
我的代码:
isbnnumber = input('Please input your 10 digit book no. : ')
while len(isbnnumber) != 10:
print('You have not entered a 10 digit value! Please try again.')
isbnnumber = input('Please input your 10 digit book no. : ')
else:
no1 = int(isbnnumber[0])*11
no2 = int(isbnnumber[1])*10... etc...
非常感谢帮助,谢谢。
答案 0 :(得分:3)
您可以使用str.isdigit
来测试字符串是否都是数字:
while len(isbnnumber) != 10 or not isbnnumber.isdigit():
参见下面的演示:
>>> '123'.isdigit()
True
>>> '123a'.isdigit()
False
>>>
>>>
>>> isbnnumber = input('Please input your 10 digit book no. : ')
Please input your 10 digit book no. : 123
>>> while len(isbnnumber) != 10 or not isbnnumber.isdigit():
... print('You have not entered a 10 digit value! Please try again.')
... isbnnumber = input('Please input your 10 digit book no. : ')
...
You have not entered a 10 digit value! Please try again.
Please input your 10 digit book no. : 123456789
You have not entered a 10 digit value! Please try again.
Please input your 10 digit book no. : 123456789a
You have not entered a 10 digit value! Please try again.
Please input your 10 digit book no. : 1234567890
>>>
答案 1 :(得分:1)
请注意,不仅有ISBN-10,还有ISBN-13(事实上在全球更常用)。 此外,ISBN-10不必是所有数字:一个数字是校验和,可以评估字母" X" (当数字为10时,数字)。 而你正在做的事情:检查那些校验和数字;他们在那里是有原因的。
所以我建议你做一些辅助功能:
def is_valid_isbn(isbn):
return is_valid_isbn10(isbn) or is_valid_isbn13(isbn)
def is_valid_isbn10(isbn):
# left as an exercise
return len(...) and isbn10_validate_checksum(isbn)
def is_valid_isbn13(isbn):
# left as an exercise
return len(...) and isbn13_validate_checksum(isbn)
并按如下方式实现输入循环:
valid_isbn=False
while not valid_isbn:
isbn = input('Please input your ISBN: ')
valid_isbn = is_valid_isbn(isbn) and isbn # and part is optional, little trick to save your isbn directly into the valid_isbn variable when valid, for later use.
答案 2 :(得分:0)
您可以使用更丰富的检查数字的条件替换while循环的条件,例如:
while not isbnnumber.isdigit() or len(isbnnumber) != 10:
答案 3 :(得分:0)
使用regular expressions,您可以精确测试给定字符串的已定义格式。
import re
m = re.match(r'^\d{10}$', isbn)
if m:
# we have 10 digits!
此处的正则表达式为\d{10}
。 \d
意味着,您正在寻找一个数字,{10}
表示您需要十个数字。 ^
标记字符串的开头,$
标记字符串的结尾。
使用正则表达式并不总是您需要的,如果您是第一次使用它们,则需要一些时间来理解。但正则表达式是最强大的开发工具之一。