【问题标题】:TypeError: can only concatenate tuple (not "int") in PythonTypeError:只能在 Python 中连接元组(不是“int”)
【发布时间】:2013-11-05 18:16:02
【问题描述】:

我将需要您的帮助来解决我不断收到的这个不断出现的元组错误。似乎这是许多人常见的数学错误。我已经阅读了几乎所有 TypeError 实例,包括“not int”、“not list”、“not float”等。但我无法弄清楚为什么会得到它。

我编写了下面的代码,允许您输入随机数的总和,最后它会计算您的成功率。所以我有一个计数器“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 . . .

【问题讨论】:

    标签: python tuples typeerror


    【解决方案1】:

    您的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
    

    【讨论】:

      【解决方案2】:
      right = checkAnswer(number1, number2, answer, right)
      

      您正在分配 checkAnswer 返回的内容。但是您正在从中返回一个元组。

      return right, answer
      

      所以,在第一次迭代之后,right 变成了一个元组。当它到达

      right = right + 1
      

      第二次,它无法将 int 添加到元组中。

      【讨论】:

        【解决方案3】:

        我认为您的 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()
        

        【讨论】:

          【解决方案4】:

          尝试rightFloat = float(right[0] + 1) 并仅引用rightFloat。只是一个解决方法,以防你变得懒惰。

          【讨论】:

          • 你真的读过OP代码吗? right 始终是一个数字,它变成一个元组的事实是一个惊喜,不是目标。
          • 然后在这种情况下获取元组的第一个值并将其添加到其中。不难。
          • 那么right 设置为0.0 的第一个调用呢?与其解决症状,不如解决实际问题。
          • 点了。但是话又说回来,您可以只使用intRight = right[0] + 1,然后在需要的地方使用intRight
          • 但是这里的问题是一个函数返回一个元组,因为 OP 误解了一些语法。解决这个问题意味着根本没有元组,问题就消失了。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-05-13
          • 2021-07-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多