2016-11-08 1 views
0

J'essaye de faire un code simple qui prend l'entrée d'utilisateur et l'ajoute à une liste. Je veux que l'utilisateur saisisse les scores jusqu'à ce qu'ils appuient sur "Q" pour quitter. Pour une raison quelconque, il pense que mon userInput est une chaîne, quand ce n'est pas le cas. Chaque fois qu'un utilisateur met un nombre, je veux qu'il convertisse cette entrée en nombre entier. Mais ça ne me laissera pas faire ça parce que "ça ne peut pas avoir de" supérieur "Je l'ai fait auparavant sur un autre programme, donc je ne sais pas pourquoi ça ne me le laissera pas maintenant Voici mon code:Le programme continue à me donner une erreur d'attribut: 'int' n'a aucun attribut 'supérieur'

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() 
+0

l'intérieur de votre boucle pendant que vous faites ceci: 'int (UserInput)'. Donc, vous jetez votre 'userInput' à un' int'. Comme l'erreur indique, 'int' n'a pas de méthode' upper'. La méthode 'upper' est une méthode * string *. – idjaw

+0

En outre, il semble que ce code va durer éternellement. 'userInput' ne sera jamais" Q "dans votre boucle' while'. – idjaw

+0

Pour clarifier: la première fois que vous entrez dans la boucle 'while',' userInput' est en effet une chaîne, mais après cela, c'est un 'int'. Puisque vous ne changez jamais 'userInput', votre boucle while ne se terminera jamais, et' userInput' reste un 'int'. Vous aurez également besoin d'une fonction 'input()' dans votre boucle while, vers la fin. – Evert

Répondre

0

Pensez à cela un instant. Sur la ligne

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

Si votre utilisateur entre la chaîne « 10 » (méthode parce que l'entrée() vous donne toujours une chaîne), puis la première chose votre boucle while fait est d'essayer de faire en majuscule

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

Alors, à quoi ressemble une majuscule «10»?

1

Comme la dernière ligne de la boucle while, ajoutez

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

Cela devrait résoudre votre problème.

Vous utilisez une boucle while et vous donnez une condition pour la rompre lorsque l'utilisateur entre une lettre Q. Cela signifie que vous voulez que l'utilisateur continue à donner plusieurs entrées. Jusqu'à présent, dans votre programme, il ne prend qu'une seule fois l'entrée de l'utilisateur. Par conséquent, sur la deuxième itération de la boucle while, il vérifie la condition userInput.upper() != "Q" avec une variable que vous avez castée en int. C'est là que vous obtenez votre erreur. En ajoutant une ligne pour prendre une autre entrée de l'utilisateur à la fin de la boucle devrait résoudre votre problème.

1

À chaque itération de votre boucle while, votre userInput est convertie en nombre entier. Le type entier n'a pas l'attribut .upper(), donc Python déclenche une erreur en conséquence.

Une meilleure façon d'atteindre votre objectif serait d'utiliser une boucle while True à la place. De cette façon, vous éviter de tester l'entrée utilisateur dans votre boucle while, et vous permettent d'utiliser .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) 
0

Essayez d'utiliser une variable pour la condition de la boucle, puis faire la boucle fausse quand

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

0

J'ai peu de choses à noter avant de fournir la solution que vous recherchez.

  1. En termes de style, veuillez rester cohérent dans tout votre code pour plus de lisibilité.
  2. Version Python: Selon la version de Python que vous utilisez, vous pouvez ou non rencontrer des erreurs de ce type.

    input() -> python2.x n'interprète pas bien les lettres. Il convertit ensuite en une variable et essaie de les interpréter. Par conséquent, provoquant l'échec de votre programme. Raw_input() -> prend réellement l'entrée et vous permet de faire tout ce que vous voulez.

  3. à code fixe:

    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()

0

entrée de l'utilisateur est à l'intérieur de la boucle while et doivent utiliser try block pour attraper les exceptions en conséquence. Puisque upper() ne peut pas être utilisé avec des entiers, utilisez à la fois 'Q' et 'q' pour la validation séparément.

Code de travail:

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)) 
+0

Ajouter une explication avec une réponse sur la façon dont cette réponse aide OP à résoudre le problème actuel –