2013-10-26 175 views
4

我需要您幫助解決這個不斷出現的常量元組錯誤。似乎這是很多人常見的數學錯誤。我已經讀過幾乎所有TypeError的實例,包括'not int','not list','not float'等。但是我沒有弄清楚爲什麼我會得到它。TypeError:只能在Python中連接元組(不是「int」)

我已經寫了下面的代碼,允許你輸入隨機數的總和,最後它會計算你的成功率。所以我有一個計數器「right = right + 1」來計算我的正確答案。看起來好像Python不喜歡那樣。

這是我採寫:

import random 
#the main function 
def main(): 
    counter, studentName, averageRight, right, answer, number1, number2 = declareVariables() 
    studentName = inputNames() 

    while counter < 10: 
     number1, number2 = getNumber() 
     answer = getAnswer(number1, number2, answer) 
     right = checkAnswer(number1, number2, answer, right) 
     counter = counter + 1 
    results(right, averageRight) 
    displayInfo(studentName, right, averageRight) 

def declareVariables(): 
    counter = 0 
    studentName = 'NO NAME' 
    averageRight = 0.0 
    right = 0.0 
    answer = 0.0 
    number1 = 0 
    number2 = 0 
    return counter, studentName, averageRight, right, answer, number1, number2 

def inputNames(): 
    studentName = raw_input('Enter Student Name: ') 
    return studentName 

def getNumber(): 
    number1 = random.randint(1, 500) 
    number2 = random.randint(1, 500) 
    return number1, number2 

def getAnswer(number1, number2, answer): 
    print 'What is the answer to the following equation' 
    print number1 
    print '+' 
    print number2 
    answer = input('What is the sum: ') 
    return answer 

def checkAnswer(number1, number2, answer, right): 
    if answer == number1+number2: 
     print 'Right' 
     right = right + 1 
    else: 
     print 'Wrong' 

    return right, answer 

def results(right, averageRight): 
    averageRight = right/10 
    return averageRight 



def displayInfo(studentName, right, averageRight): 
    print 'Information for student: ',studentName 
    print 'The number right: ',right 
    print 'The average right is: ', averageRight 

# calls main 
main() 

和我不斷收到:

Traceback (most recent call last): 
    File "Lab7-4.py", line 70, in <module> 
    main() 
    File "Lab7-4.py", line 15, in main 
    right = checkAnswer(number1, number2, answer, right) 
    File "Lab7-4.py", line 52, in checkAnswer 
    right = right + 1 
TypeError: can only concatenate tuple (not "int") to tuple Press any key to continue . . . 

回答

11

checkAnswer()函數返回一個元組

def checkAnswer(number1, number2, answer, right): 
    if answer == number1+number2: 
     print 'Right' 
     right = right + 1 
    else: 
     print 'Wrong' 

    return right, answer 

這裏return right, answer返回兩個值的元組。請注意,這是使該表達式成爲元組的逗號;括號在大多數情況下都是可選的。

你這個返回值賦給right

right = checkAnswer(number1, number2, answer, right) 

使right元組在這裏。

然後當您嘗試再次將1添加到它時,會發生錯誤。你不會在函數內改變answer,所以在這裏返回值沒有意義。從return聲明中刪除:

def checkAnswer(number1, number2, answer, right): 
    if answer == number1+number2: 
     print 'Right' 
     right = right + 1 
    else: 
     print 'Wrong' 

    return right 
1
right = checkAnswer(number1, number2, answer, right) 

你分配什麼是checkAnswer返回。但是你從它返回一個元組。因此,在第一次迭代right成爲元組之後。當它到達時

right = right + 1 

第二次,它無法將一個int添加到一個元組。

-1

嘗試rightFloat = float(right[0] + 1),只是引用rightFloat。只是一個解決方法,以防你懶惰。

+0

您是否真的讀過OP代碼? 「right」本來就是一個數字,它變成一個元組是一個驚喜,而不是目標。 –

+0

然後在這種情況下,取出元組的第一個值並將其添加到該元組中。不難。 – DevinLynch99

+1

以及「right」設置爲「0.0」的第一次調用呢?而不是修復症狀,解決實際問題。 –

0

我不認爲你的averageRight給出正確的結果。所以我修復了代碼。我正在使用IDLE 3.5.2,因此某些語法看起來可能有點不同(例如print())。所以下面是代碼。歡迎您:)

import random 
#the main function 
def main(): 
    counter, studentName, averageRight, right, answer, number1, number2 = declareVariables() 
    studentName = inputNames() 

    while counter < 10: 
     number1, number2 = getNumber() 
     answer = getAnswer(number1, number2, answer) 
     right = checkAnswer(number1, number2, answer, right) 
     counter = counter + 1 

    A=results(right, averageRight) 
    displayInfo(studentName, right, A) 

def declareVariables(): 
    counter = 0 
    studentName = 'NO NAME' 
    averageRight = 0.0 
    right = 0 
    answer = 0 
    number1 = 0 
    number2 = 0 
    return counter, studentName, averageRight, right, answer, number1, number2 

def inputNames(): 
    studentName = input('Enter Student Name: ') 
    return studentName 

def getNumber(): 
    number1 = random.randint(1, 500) 
    number2 = random.randint(1, 500) 
    return number1, number2 

def getAnswer(number1, number2, answer): 
    print ('What is the answer to the following equation') 
    print (number1) 
    print ('+') 
    print (number2) 
    answer = int(input('What is the sum: ')) #input would be a int. without adding the int it would make answer a string instead of int. which was reason why it was giving 'wrong' 
    return answer 

def checkAnswer(number1, number2, answer, right): 
    if answer==number1+number2: 
     print ('Right') 
     right = right + 1 
    else: 
     print ('Wrong') 

    return right 

def results(right, averageRight): 
    averageRight = right/10 
    return averageRight 



def displayInfo(studentName, right, A): 
    print ('Information for student: ',studentName) 
    print ('The number right: ',right) 
    print ('The average right is: ', A) 

# calls main 
main() 
相關問題