使用for循环时在python中获取类型错误

时间:2014-04-03 16:09:24

标签: python python-3.x isbn check-digit

我相信这对你来说是一个非常基本的问题,但我正在为我的计算类制作一个ISBN校验位计算器。我目前的代码是:

isbn = []
results = []

print("Please input your ISBN 1 number at a time")

def isbn_input():
    isbn.append(int(input("ISBN character 1: ")))
    isbn.append(int(input("ISBN character 2: ")))
    isbn.append(int(input("ISBN character 3: ")))
    isbn.append(int(input("ISBN character 4: ")))
    isbn.append(int(input("ISBN character 5: ")))
    isbn.append(int(input("ISBN character 6: ")))
    isbn.append(int(input("ISBN character 7: ")))
    isbn.append(int(input("ISBN character 8: ")))
    isbn.append(int(input("ISBN character 9: ")))
    isbn.append(int(input("ISBN character 10: ")))

isbn_input()

results.append(isbn[0] * 11)
results.append(isbn[1] * 10)
results.append(isbn[2] * 9)
results.append(isbn[3] * 8)
results.append(isbn[4] * 7)
results.append(isbn[5] * 6)
results.append(isbn[6] * 5)
results.append(isbn[7] * 4)
results.append(isbn[8] * 3)
results.append(isbn[9] * 2)

results = sum(results)
results = results % 11
results = 11 - results
print("Your ISBN is'",
      isbn[0],isbn[1],isbn[2],isbn[3],
      isbn[4],isbn[5],isbn[6],isbn[7],
      isbn[8],isbn[9],results,"'")

我知道这是一种非常低效的方式,你甚至可能会哭着看。

我尝试提高效率的第一件事是使用for循环。所以,我改变了:

def isbn_input():
    isbn.append(int(input("ISBN character 1: ")))
    isbn.append(int(input("ISBN character 2: ")))
    isbn.append(int(input("ISBN character 3: ")))
    isbn.append(int(input("ISBN character 4: ")))
    isbn.append(int(input("ISBN character 5: ")))
    isbn.append(int(input("ISBN character 6: ")))
    isbn.append(int(input("ISBN character 7: ")))
    isbn.append(int(input("ISBN character 8: ")))
    isbn.append(int(input("ISBN character 9: ")))
    isbn.append(int(input("ISBN character 10: ")))

到列表,但我还没想出如何做到这一点。这是我需要帮助的一点(另外,我知道这个功能毫无意义。我们的老师要求我们有一个,但如果有人能找到更好的方法,那么这也会很棒)

非常感谢你的帮助。再说一遍,如果你发现任何可以做得更好的东西,那就请你做。 (另外,这是python 3。)

2 个答案:

答案 0 :(得分:2)

简化输入:

isbn = [int(input("ISBN character {0}: ".format(i))) 
        for i in range(1, 11)] # or 'format(i+1)' and 'range(10)'

这使用list comprehension同时循环并构建整数列表。

或者,立即获取整个输入并将其转换为单个整数:

isbn = list(map(int, input("Enter ISBN: ")))

此处map适用int()依次转换input字符串中的每个字符。

答案 1 :(得分:1)

输入的简单for循环将是

for i in range(1, 11):
    isbn.append(int(input("ISBN character " + str(i) + ":")))

要一次阅读所有内容,您可以

isbninput = input("ISBN: ")

if len(isbninput) != 10:
    raise Exception("wrong number of digits")

for digit in isbninput:
   isbn.append(int(digit))

Python,非常棒,有更简洁的方法来编写这些简单的循环。请参阅jonrsharpe的回答。如果你还是初学者并且不完全理解那些更复杂的句法结构是如何工作的,你应该做两件事:

  • 首选您可以在睡眠中编写和阅读的代码,以及您发现更美观的代码
  • 了解如何使用它们。他们太棒了。