首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ISBN号码检查

ISBN号码检查
EN

Code Review用户
提问于 2014-04-30 15:50:12
回答 1查看 9K关注 0票数 3

我最近编写了一种检查10位ISBN的方法。

我想知道这些代码是否可以检查数字,以及我的代码中是否有任何缺陷。

代码语言:javascript
复制
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
EN

回答 1

Code Review用户

发布于 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()函数的一些一般性评论:

  • 还不清楚numberzeronumberrealnumber变量之间有什么区别。这是混合验证和打印代码的副作用.
  • 给它一个更具体的名称,并添加一个docstring (一种在Python中记录函数的方法)。稍后,您可能希望验证ISBN-13代码,并且您不希望名称空间混乱。
  • 有更好的方法来处理错误,而不是把“错误”这个词打印到控制台。您可以引发自定义的ValueError,或者其他的东西。
  • 构造num的行太长:您可以使用sum()和列表理解来以更紧凑的方式构造它,这将使您以后使用的公式更加清晰。
  • num = num%11可以替换为num %= 11。只会让事情变得更整洁。

考虑到这些要点,下面是我如何重写您的函数:

代码语言:javascript
复制
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,拜!“)
票数 8
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/48588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档