2014-04-03 48 views
0

我確定這將是一個非常基本的問題,但我正在爲我的計算類製作一個ISBN校驗碼計算器。我當前的代碼是這樣的:在使用for循環時在python中獲取類型錯誤

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: "))) 

到一個列表,但我還沒有想出如何做到這一點呢。這是我需要幫助的一點(另外,我知道這個功能沒有意義,我們的老師要求我們有一個,但是如果有人能找到更好的方法,那麼這也會很棒)

謝謝很多的幫助。再次,如果你發現任何可以做得更好的東西,那麼請做。 (另外,這是蟒3)

+2

哪裏的類型錯誤?向我們顯示生成錯誤的代碼,並顯示所述錯誤的完整回溯。 – mhlester

+0

@mhlester:這裏:'isbn [0] * 11'。調用'int(isbn [0])'。 – SzieberthAdam

+1

@SzieberthAdam在添加到isbn列表之前,他已經將輸入轉換爲int了。 – shaktimaan

回答

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字符串。

+0

這些都是非常先進的概念......你應該加入一些關於列表解析和「地圖」的解釋。 –

+0

好點,編輯。 – jonrsharpe

+0

非常感謝,評論位非常有幫助,所以感謝您付出額外的時間幫助!現在效果很好。 – user3143129

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的答案。如果你還是一個初學者,不完全理解那些更復雜的語法結構是如何工作的,你應該做兩件事情:

  • 更希望你可以寫,讀,在你睡覺的代碼,以及代碼,你會發現更多的美學
  • 瞭解如何使用它們。他們真棒。
+0

感謝您的回答。雖然我已經使用了其他答案,但我一定會閱讀並瞭解您的建議。 – user3143129