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)
算法如下所示:
1
开始,将每一位乘以一个递增的数字。这是第一个数字乘以1
,第二个数字乘以2
,直到数字10
乘以10
11
(即sum%11
)对上述总和执行模运算0
,则给定的ISBN
有效,否则无效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这不是正则表达式的任务。现在您可以编写一个更优雅的版本,也许;)