ISBN末尾数字查找器
我正在使用Python 3,正在制作一个程序,这个程序可以输入一个10位的ISBN号码,并通过某种方法找出第11位数字。
这是我现在的代码:
ISBN=input('Please enter the 10 digit number: ')
while len(ISBN)!= 10:
print('Please make sure you have entered a number which is exactly 10 characters long.')
ISBN=int(input('Please enter the 10 digit number: '))
continue
else:
Digit1=int(ISBN[0])*11
Digit2=int(ISBN[1])*10
Digit3=int(ISBN[2])*9
Digit4=int(ISBN[3])*8
Digit5=int(ISBN[4])*7
Digit6=int(ISBN[5])*6
Digit7=int(ISBN[6])*5
Digit8=int(ISBN[7])*4
Digit9=int(ISBN[8])*3
Digit10=int(ISBN[9])*2
Sum=(Digit1+Digit2+Digit3+Digit4+Digit5+Digit6+Digit7+Digit8+Digit9+Digit10)
Mod=Sum%11
Digit11=11-Mod
if Digit11==10:
Digit11='X'
ISBNNumber=str(ISBN)+str(Digit11)
print('Your 11 digit ISBN Number is ' + ISBNNumber)
我想创建一个循环,让变量名中的“Digit”后面的数字从1开始增加(如果从0开始更简单也可以),方括号中的数字从0开始增加,而乘法的数字从11递减到2。
有没有什么方法可以让这段代码写得更高效一些呢?
2 个回答
0
在编程中,有时候我们会遇到一些问题,尤其是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,但其实很多时候,解决这些问题的方法是比较简单的。
比如,有人可能在使用某个特定的功能时,发现它没有按照预期工作。这时候,我们可以尝试检查一下代码,看看是否有拼写错误或者遗漏了某些步骤。很多时候,问题的根源就是这些小细节。
此外,查阅相关的文档或者社区的讨论也是一个好办法。很多时候,别人也遇到过类似的问题,他们的解决方案可能会给我们带来启发。
总之,遇到问题时不要慌张,冷静下来,仔细检查代码,必要时寻求帮助,通常都能找到解决办法。
ISBN=int(input('Please enter the 10 digit number: ')) # Ensuring ISBN is an integer
while len(ISBN)!= 10:
print('Please make sure you have entered a number which is exactly 10 characters long.')
ISBN=int(input('Please enter the 10 digit number: '))
continue
else:
Sum = 0
for i in range(len(ISBN)):
Sum += ISBN[i]
Mod=Sum%11
Digit11=11-Mod
if Digit11==10:
Digit11='X'
ISBNNumber=str(ISBN)+str(Digit11)
print('Your 11 digit ISBN Number is ' + ISBNNumber)
2
我觉得这个应该能满足你的需求。
def get_isbn_number(isbn):
digits = [(11 - i) * num for i, num in enumerate(map(int, list(isbn)))]
digit_11 = 11 - (sum(digits) % 11)
if digit_11 == 10:
digit_11 = 'X'
digits.append(digit_11)
isbn_number = "".join(map(str, digits))
return isbn_number
示例
>>> print(get_isbn_number('2345432681'))
22303640281810242428
>>> print(get_isbn_number('2345432680'))
2230364028181024240X
第二行的解释:
digits = [(11 - i) * num for i, num in enumerate(map(int, list(isbn)))]
可以写成这样:
isbn_letters = list(isbn) # turn a string into a list of characters
isbn_numbers = map(int, isbn_letters) # run the function int() on each of the items in the list
digits = [] # empty list to hold the digits
for i, num in enumerate(isbn_numbers): # loop over the numbers - i is a 0 based counter you get for free when using enumerate
digits.append((11 - i) * num) # If you notice the pattern, if you subtract the counter value (starting at 0) from 11 then you get your desired multiplier