使用for循环时在Python中遇到类型错误

0 投票
2 回答
1390 浏览
提问于 2025-04-18 01:12

我知道这个问题对你们来说可能很基础,但我正在为我的计算机课制作一个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,"'")

我知道这样做效率非常低,看到它你们可能会想哭。

为了提高效率,我首先尝试使用一个循环。所以,我把:

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 个回答

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 的回答。如果你还是个初学者,对那些更复杂的语法结构不太理解,你可以做两件事:

  • 选择那些你能在梦里写出来、读起来也觉得舒服的代码,以及你觉得更美观的代码
  • 学习如何使用它们。它们真的很棒。
2

为了简化输入:

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

这里使用了一种叫做列表推导式的方法,可以同时循环并生成一个整数列表。

另外,你也可以一次性获取所有输入,然后把它们转换成单独的整数:

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

在这里,map函数会把int()应用到input字符串中的每一个字符上,逐个进行转换。

撰写回答