Python 程序未按预期运行
Python Program not working as expected
我试图创建一个基于 python 的 ISBN13 有效性计算器,它应该根据以下代码片段工作。它接受一个字符串类型的参数并打印结果。
我不明白我哪里错了,在这个程序中,常识告诉我 num
将交替给出 3 或 1。
def isbncheck(isbn):
num = int(0)
for i in range(0,12):
if num % 2 is 1:
num = num + (int(isbn[i])*3)
print(isbn[i] + " * 3 + at i=" + str(i))
elif num % 2 is 0:
num = num + (int(isbn[i]))
print(isbn[i] + " * 1 + at i=" + str(i))
else:
print("Unhandled Exception.")
print("_"*7)
print(num)
num = num%10
print(num)
print(isbn[12])
print(int(isbn[12]))
if num != int(isbn[12]):
print("This is not valid")
else:
print("It is Valid.")
print(isbncheck("9788177000252"))
我希望输出为 1 和 3 的交替因子。相反,我得到了这个:
9 * 1 + at i=0
7 * 3 + at i=1
8 * 1 + at i=2
8 * 1 + at i=3
1 * 1 + at i=4
7 * 3 + at i=5
7 * 1 + at i=6
0 * 3 + at i=7
0 * 3 + at i=8
0 * 3 + at i=9
2 * 3 + at i=10
5 * 3 + at i=11
_______
96
6
2
2
This is not valid
None
你是如何解决这个问题的?除了不扩大循环?
你的问题在这里:
for i in range(0,12):
if num % 2 is 1:
num
是您的累计金额。您必须检查索引,而不是到目前为止的总和。
for i in range(len(isbn)):
digit = int(isbn[i])
if i % 2 == 1:
num += 3 * digit
另请注意一些小改进:
- 由于必须引用该值两次,因此转换为
int
并临时保存在 digit
中。
- 使用
==
进行数值比较; is
给你 object 比较,一般情况下会失败。
根据 ISBN 规范,3 每隔一个数字出现一次,因此您的 if 语句应该是 if i % 2 is 1:
,而不是 if num % 2 is 1:
(elif 应该相应更改)。
还有,你必须取10减去模运算的结果;所以在 num = num%10
之后你会有新的行 num = 10 - num
。否则您计算的校验位 (num
) 将不正确。
另一个注意事项:is
仅适用于某些实现来比较 -1 和 256 (source) 之间的数字,这就是它在这种情况下起作用的原因。但一般来说 ==
更适合比较两个数字。
我试图创建一个基于 python 的 ISBN13 有效性计算器,它应该根据以下代码片段工作。它接受一个字符串类型的参数并打印结果。
我不明白我哪里错了,在这个程序中,常识告诉我 num
将交替给出 3 或 1。
def isbncheck(isbn):
num = int(0)
for i in range(0,12):
if num % 2 is 1:
num = num + (int(isbn[i])*3)
print(isbn[i] + " * 3 + at i=" + str(i))
elif num % 2 is 0:
num = num + (int(isbn[i]))
print(isbn[i] + " * 1 + at i=" + str(i))
else:
print("Unhandled Exception.")
print("_"*7)
print(num)
num = num%10
print(num)
print(isbn[12])
print(int(isbn[12]))
if num != int(isbn[12]):
print("This is not valid")
else:
print("It is Valid.")
print(isbncheck("9788177000252"))
我希望输出为 1 和 3 的交替因子。相反,我得到了这个:
9 * 1 + at i=0
7 * 3 + at i=1
8 * 1 + at i=2
8 * 1 + at i=3
1 * 1 + at i=4
7 * 3 + at i=5
7 * 1 + at i=6
0 * 3 + at i=7
0 * 3 + at i=8
0 * 3 + at i=9
2 * 3 + at i=10
5 * 3 + at i=11
_______
96
6
2
2
This is not valid
None
你是如何解决这个问题的?除了不扩大循环?
你的问题在这里:
for i in range(0,12):
if num % 2 is 1:
num
是您的累计金额。您必须检查索引,而不是到目前为止的总和。
for i in range(len(isbn)):
digit = int(isbn[i])
if i % 2 == 1:
num += 3 * digit
另请注意一些小改进:
- 由于必须引用该值两次,因此转换为
int
并临时保存在digit
中。 - 使用
==
进行数值比较;is
给你 object 比较,一般情况下会失败。
根据 ISBN 规范,3 每隔一个数字出现一次,因此您的 if 语句应该是 if i % 2 is 1:
,而不是 if num % 2 is 1:
(elif 应该相应更改)。
还有,你必须取10减去模运算的结果;所以在 num = num%10
之后你会有新的行 num = 10 - num
。否则您计算的校验位 (num
) 将不正确。
另一个注意事项:is
仅适用于某些实现来比较 -1 和 256 (source) 之间的数字,这就是它在这种情况下起作用的原因。但一般来说 ==
更适合比较两个数字。