Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查ISBN编号_Python - Fatal编程技术网

Python 检查ISBN编号

Python 检查ISBN编号,python,Python,这是我的代码: def isISBN(n): if len(n)!= 10: return False else: d1=int(n[0])*1 d2=int(n[1])*2 d3=int(n[2])*3 d4=int(n[3])*4 d5=int(n[4])*5 d6=int(n[5])*6 d7=int(n[6])*7 d8=int(

这是我的代码:

def isISBN(n):
    if len(n)!= 10:
        return False
    else:
        d1=int(n[0])*1
        d2=int(n[1])*2
        d3=int(n[2])*3
        d4=int(n[3])*4
        d5=int(n[4])*5
        d6=int(n[5])*6
        d7=int(n[6])*7
        d8=int(n[7])*8
        d9=int(n[8])*9
    d10=(d1+d2+d3+d4+d5+d6+d7+d8+d9)
    num=d10%11
    print(d10,num)
    if num==10:
        return True
    else:
        return False
以下是老师给我们的一些测试案例:

>>> isISBN('020103803X')
True
>>> isISBN('0540122068')
True
>>> isISBN('020108303X')
False
>>> isISBN('0540122069')
False
代码未通过测试,因为我的输出为False,但我不知道为什么。

根据这一点,有一种数学方法可以计算ISBN的正确性

此外,还有对该算法的另一个简要描述:

十位国际标准书号的最后一个字符 是否计算校验位,以便将每个数字乘以其 在数字中的位置(从右边开始计数)并取 这些乘积的模11为0。最右边的数字 (乘以1)是选择用于求和的校验位 对的它可能需要具有值10,表示为 字母X。例如,以ISBN 0-201-53082-1为例: 产品为0×10+2×9+0×8+1×7+5×6+3×5+0×4+8×3+2×2+1×1 = 99 ≡ 0(mod 11)。因此,ISBN是有效的。注意,位置也可以从左开始计数,在这种情况下,校验位乘以 10、有效性检查:0×1+2×2+0×3+1×4+5×5+3×6+0×7+8×8+ 2×9 + 1×10 = 143 ≡ 0(mod 11)

算法如下所示:

  • 从左边开始,从ISBN的每一位开始,从
    1
    开始,将每一位乘以一个递增的数字。这是第一个数字乘以
    1
    ,第二个数字乘以
    2
    ,直到数字
    10
    乘以
    10
  • 然后将这些乘法相加
  • 您使用数字
    11
    (即
    sum%11
    )对上述总和执行模运算
  • 如果模运算返回
    0
    ,则给定的
    ISBN
    有效,否则无效
  • 从上述参考资料中可以看出,您的错误如下:

  • 你不需要把第10位乘以10
  • 如果模运算返回的是
    0
    而不是您编写的
    10
    ,则
    ISBN
    有效
  • 注:

    根据上述参考状态,您可以将最后一位数字设置为
    X
    ,因为
    10
    不能作为
    ISBN
    中的数字。在这种情况下,您希望检查第10位数字是否为
    X
    ,以使用
    10
    数字,而不是像这样:

    d10 = 10*10 if n[9] == "X" else n[9]*10
    

    不要忘记第10个值,并检查模数是否等于0:

    def isISBN(n):
        if len(n)!= 10:
            return False
        else:
            d1=int(n[0])*1
            d2=int(n[1])*2
            d3=int(n[2])*3
            d4=int(n[3])*4
            d5=int(n[4])*5
            d6=int(n[5])*6
            d7=int(n[6])*7
            d8=int(n[7])*8
            d9=int(n[8])*9
            if n[9] == 'X':
                d10 = 10
            else:
                d10 = int(n[9])
            d10 = d10*10
            d11=(d1+d2+d3+d4+d5+d6+d7+d8+d9+d10)
            num=d11%11
            if num==0:
                return True
            else:
                return False
    
    isISBN("3680087837")
    

    你的逻辑是什么…什么是一个好的ISBN数字?为什么有些案例包含字符?据我所知,
    ISBN 10
    不包含字符(?),但如果我错了,请纠正我。编写一个python函数“isISBN(n)”,该函数接受10个字符的字符串,并测试n是否是有效的ISBN。您可以假设字符串有10个字符,您不需要检查:您好@YingweiFan,请看一看。@jxramos这不是正则表达式的任务。现在您可以编写一个更优雅的版本,也许;)