我最近编写了一种检查10位ISBN的方法。
我想知道这些代码是否可以检查数字,以及我的代码中是否有任何缺陷。
def isbn(number):
try:
numberreal = number
#keeps real number with "-"
numberzero = number.replace("-", "")
#this makes sure python doesnt drop the first 0 if it is at the start
number = number.replace("-", "")
number = int(number)
number = str(numberzero)
print("The ISBN Number Entered is", numberreal)
num = int(number[0]) * 10 + int(number[1]) * 9 + int(number[2]) * 8 + int(number[3]) * 7 + int(number[4]) * 6 + int(number[5]) * 5 + int(number[6]) * 4 + int(number[7]) * 3 + int(number[8]) * 2
num = num%11
checknum = 11 - num
print("The Check Digit Should Be", checknum, "and the one in the code provided was", number[9])
if int(checknum) == int(number[9]):
print("The Check Digit Provided Is Correct")
else:
print("The Check Digit Provided Is Incorrect")
except ValueError:
print("Not Valid Number")
error()
except IndexError:
print("Not 10 Digits")
error()
def error():
print("Error")
running = True
while running == True:
isbn(input("What is the isbn 10 digit number? "))
restart = input("Do You Want Restart?")
restart = restart.lower()
if restart in ("yes", "y", "ok", "sure", ""):
print("Restarting\n" + "-" * 34)
else:
print("closing Down")
running = False发布于 2014-04-30 17:29:33
现在,代码不起作用。您的代码只验证使用阿拉伯数字的ISBN,但是一些ISBN可以以"X“结尾。引用ISBN常见问题的话:
为什么一些ISBN以"X“结尾?在检查数字的情况下,ISBN的最后一个数字,大写X可以出现。确定ISBN校验位数的方法是模数11,加权因子为10 ~ 1,用罗马数字X代替10,其中10作为校验位数。
所以你应该先想一想怎么解决这个问题。
isbn()函数的注释
我不是这样写的。您的函数不返回True/False值。交互作用并向用户输出内容的代码和验证ISBN的代码都是交织在一起的。我会把两者分开。这将使像"X“这样的调试问题变得更容易,您可以在以后重用验证功能。
例如,如果要将IBSNs输入数据库,并验证输入的数字是否准确,则可以从函数中获得一个True/False值,而无需打印到控制台。
下面是关于现有isbn()函数的一些一般性评论:
numberzero、numberreal和number变量之间有什么区别。这是混合验证和打印代码的副作用.ValueError,或者其他的东西。num的行太长:您可以使用sum()和列表理解来以更紧凑的方式构造它,这将使您以后使用的公式更加清晰。num = num%11可以替换为num %= 11。只会让事情变得更整洁。考虑到这些要点,下面是我如何重写您的函数:
def validate_isbn10(number):
"""A function for validating ISBN-10 codes."""
formatted_num = number.replace("-", "")
if len(formatted_num) != 10:
raise ValueError('The number %s is not a 10-digit string.' % number)
check_sum = sum(int(formatted_num[i]) * (10 - i) for i in xrange(8))
check_sum %= 11
check_digit = 11 - check_sum
if formatted_num[-1] == "X":
return check_digit == 10
else:
return check_digit == int(formatted_num[-1])如果您希望能够告诉用户正确的检查数字应该是什么(如果字符串格式不正确),那么您也可以考虑我们的check_digit()函数。
我把它作为一个练习来编写一个单独的函数,它交互地提示用户输入ISBN-10代码,并告诉他们是否正确地格式化了它。
其余部分的注释
在剩下的代码中,下面是一些我关心的事情:
if __name__ == "__main__":块中。这意味着只有当文件被直接执行时,它才会运行,但您也可以import该文件来获取函数定义(例如,如果您想在更大的项目中使用这个ISBN验证器)。while running == True:。如果您要将其与布尔人相比,那么编写while running is True:或更好的while running:就更符合惯例了。但这不是个好办法。相反,假设您有一个interactive_user_isbn()函数,它运行与用户的交互式会话。然后在这个函数的末尾,如果他们想再去,那么你可以问他们,如果他们问了,再次调用这个函数。使重复提示符更清楚地说明将要重复的内容,并提示他们可以键入什么来重复这个函数。如果他们什么都不打,我就会错误地假设他们不想再去,但这只是我的观点。类似于: def interactive_user_isbn():#向用户询问ISBN #检查是否正确#向用户发送恭维等重复=输入(“您要检查另一个号码吗?(y/n)")如果repeat.lower()在“是”,“y”,“好”,“当然”:print("\n") interactive_user_isbn():print(”in,拜!“)https://codereview.stackexchange.com/questions/48588
复制相似问题