我试图从一个12位数的ISBN返回ISBN-13校验位,但遇到了一个奇怪的错误。在
以下是我的12位ISBN-978311020318
每个数字交替乘以1或3。在
9*1+7*3+8*1+3*3+1*1+1*3+0*1+2*3+0*1+3*3+1*1+8*3=91
91%10=1
10-1=9,这是我们的ISBN-13校验位。在
这就是我目前所拥有的。。。在
def isbn_check_digit(isbn):
s = 0
for i, d in enumerate(isbn):
if i % 2 == 0:
s += int(d*1)
else:
s += int(d*3)
print(s)
return (10 - (s % 10))
print(isbn_check_digit("978311020318"))
输出如下。。。在
^{pr2}$我把它拆开看看发生了什么
if i % 2 == 0:
s += int(d*1)
print(s)
else:
s += 0
9
17
18
18
18
19
1
1的倍数运行良好,但为什么它在3的倍数下表现异常呢?在
因为,在计算表达式},而不是{}。在
int(d * 3)
时,d
不是一个数字,而是一个由一个字符组成的字符串,它是一个数字。结果,它乘以3将重复这个数字三次:例如,3
将变成{在将字符串转换为整数后,您希望乘以3:
@dustwuff给出了原因,但另一个修复方法是使用
map
然后将字符串转换为列表:map
将对iterable的每个成员应用函数。在本例中,应用int
将把字符串转换成一个数字列表。在相关问题 更多 >
编程相关推荐