程序不断给我一个属性错误:' int'没有属性' upper'

时间:2016-11-08 03:52:44

标签: python attributeerror

我试图创建一个简单的代码,它接受用户输入并将其添加到列表中。我希望用户输入分数,直到他们按下" Q"退出。出于某种原因,它认为我的userInput是一个字符串,当它不是。每次用户输入数字时,我希望它将该输入转换为整数。但它不会让我这样做,因为它不能有一个“上层”。我之前在另一个节目上做过这个,所以我不知道为什么它现在不让我。这是我的代码:

def main():
    list1= []
    userInput= input("Please enter an integer between 0 and 10: ")
    amountOfscoresEntered= 0
    while userInput.upper() != "Q":
        userInput= int(userInput)
        amountOfscoresEntered= amountOfscoresEntered + 1
        if userInput < 0 or userInput > 10:
            print("Invalid Input")
        else:
            list1.append(userInput)
            totalNumofPointsearned= sum(list1)
main()

6 个答案:

答案 0 :(得分:1)

作为while循环的最后一行,添加

userInput= input("Please enter an integer between 0 and 10: ")

这应该可以解决您的问题。

您正在使用while循环并给出条件以在用户输入字母Q时将其中断。这意味着您希望用户继续提供多个输入。到目前为止,在您的程序中,它只需要用户输入一次。因此,在while循环的第二次迭代中,它将使用您转换为userInput.upper() != "Q"的变量检查条件int。这是您收到错误的地方。通过添加一行来将另一个用户输入带到循环的末尾,可以解决您的问题。

答案 1 :(得分:1)

在while循环的每次迭代中,将userInput转换为整数。整数类型没有属性.upper(),因此Python会相应地引发错误。

实现目标的更好方法是使用while True循环。这样,您就可以避免在while循环中测试用户输入,并允许自己使用.upper()

def main():
    list1 = []
    amountOfscoresEntered = 0

    while True: # use while true instead

        # get user input repeatedly
        userInput = input("Please enter an integer between 0 and 10: ")

        # lets check the user input
        # before we cast it to an integer.
        if userInput.upper() == "Q": 
            break

        elif 0 < int(userInput) < 10:
            print("Invalid Input")

        else:
            # once we have verified that
            # our input is what we want,
            # we can cast `userInput` to
            # an integer, and add it to
            # `list1`.
            list1.append(int(userInput))
            amountOfscoresEntered += 1

    totalNumofPointsearned = sum(list1)

答案 2 :(得分:0)

想一想。在

userInput= input("Please enter an integer between 0 and 10: ") # input always gives string, even if they enter a number.

如果你的用户输入字符串'10'(因为input()方法总是给你一个字符串)那么你的while循环所做的第一件事是尝试将它设为大写

while userInput.upper() != "Q":

那么,大写'10'是什么样的?

答案 3 :(得分:0)

尝试使用变量作为循环条件,然后在

if userInput.isalpha(): 
    if userInput.upper() == "Q": 
        running = False

时将循环设为false

答案 4 :(得分:0)

在提供您正在寻找的解决方案之前,我没有什么需要注意的事项。

  1. 在风格方面,请在整个代码中保持一致,以便于阅读。
  2. Python版本:根据您使用的python版本,您可能会遇到或不会遇到此类错误。

    input() - &gt; python2.x不能很好地解释字母。它然后转换为变量并尝试解释它们。因此,导致您的程序失败。

    raw_input() - &gt;实际上接受输入并允许您做任何你想做的事情。

  3. 固定代码:

    def main():
       list1 = []
       amountOfScoresEntered = 0
       totalNumOfPointsEarned = 0
       userInput= raw_input("Please enter an integer between 0 and 10: ")
       while str(userInput).upper()!="Q":
    
            amountOfScoresEntered= amountOfScoresEntered + 1
    
            if int(userInput) < 0 and int(userInput) > 10:
                print("Invalid Input")
            else:
                list1.append(userInput)
                totalNumofPointsEarned= sum(list1)
    
            userInput= raw_input("Please enter an integer between 0 and 10: ")
    main()
    
  4. input() and raw_input() reference

  5. Input and Output

  6. raw_input()

答案 5 :(得分:0)

用户输入已经在while循环中,并且必须使用try块来相应地捕获异常。由于upper()不能与整数一起使用,因此分别使用'Q'和'q'进行验证。

工作代码:

def main():
list1 = []
amountOfscoresEntered = 0
totalNumofPointsearned=0
while True:
    userInput = input("Please enter an integer between 0 and 10: ")
    try:
        if userInput == "Q" or userInput == 'q':
            break
        elif not userInput.isalpha() and not int(userInput) < 0 and not int(userInput) >10:
            userInput = int(userInput)
            amountOfscoresEntered = amountOfscoresEntered + 1
            list1.append(userInput)
            totalNumofPointsearned = sum(list1)
        else:
            print("Invalid Input")
    except ValueError:
            print ('Invalid Input')
return amountOfscoresEntered, totalNumofPointsearned


if __name__ == '__main__':
    attempt, total_point_earned = main()
    print('Number of Attempts=%s \nTotal Points Earned=%s' %(attempt,total_point_earned))