2013-04-04 3 views
0

J'écris une interface utilisateur pour un tour de golf où il y a un fichier texte avec les noms des joueurs dans la ligue. L'utilisateur entre les scores de chaque joueur pour 9 trous et le score brut, les pars, et les birdies pour chaque joueur est retourné. Je reçois cette erreur:python type d'opérande non supporté numéro

Traceback (most recent call last): 
    File "<pyshell#18>", line 1, in <module> 
    main() 
    File "/Users/tinydancer9454/Documents/python/golfRound.py", line 101, in main 
    enterScores(l, players) 
    File "/Users/tinydancer9454/Documents/python/golfRound.py", line 114, in enterScores 
    p.recordScores(holeScores) 
    File "/Users/tinydancer9454/Documents/python/golfRound.py", line 42, in recordScores 
    self.__gross = sum(holeScores) 
TypeError: unsupported operand type(s) for +: 'int' and 'str' 

Je ne sais pas vraiment comment le résoudre parce que je ne suis pas censé être changer la classe du joueur ou de la Ligue.

class Player: 
""" Represents a player in the golf league """ 

    PAR = [4, 3, 4, 3, 4, 5, 4, 3, 5] 
    """ par for each of the 9 holes """ 

    def __init__(self, name): 
     """ creates a Player and keeps track of stats """ 
     self.__name = name 
     self.__pars = 0 
     self.__birdies = 0 
     self.__gross = 0 

    def getName(self): 
     """ returns a player's name """ 
     return self.__name 

    def getGross(self): 
     """ returns a player's gross score """ 
     return self.__gross 

    def getPars(self): 
     """ returns number of pars made """ 
     return self.__pars 

    def getBirdies(self): 
     """ returns number of birdies made """ 
     return self.__birdies 

    def recordScores(self, holeScores): 
     """ mutator method that uses the results of one round of play 
      (9 holes) to update a player's stats """ 
     self.__gross = sum(holeScores) 
     self.__findparsandbirdies(holeScores) 

    def __findparsandbirdies(self, scores): 
     """ helper method that finds the number of pars and birdies """ 

     pars = 0 
     birdies = 0 
     hole = 0 
     for score in scores: 
      if score == Player.PAR[hole]: 
       pars += 1 
      if score == Player.PAR[hole] - 1: 
       birdies += 1 
      hole += 1 
     self.__pars = pars 
     self.__birdies = birdies 

    def __str__(self): 
     """ returns a string representation of a player """ 
     return 'a Player named ' + self.__name 

class League: 
""" represents the players of a golf league """ 

    def __init__(self, fileName = 'players.txt'): 
     """ creates a list of Player objects from the 
      names stored in the file specified """ 
     self.__playerList = [] 
     datafile = open(fileName, 'r') 
     for line in datafile: 
      playerName = line.rstrip() 
      player = Player(playerName) 
      self.__playerList.append(player) 

    def getNumPlayers(self): 
     """ returns the number of players is the league """ 
     return len(self.__playerList) 

    def getPlayerbyPosition(self, position): 
     """ returns the player at the specified position """ 
     return self.__playerList[position] 

    def getPlayerbyName(self, name): 
     """ returns the player with the specified name """ 
     for player in self.__playerList: 
      if player.getName() == name: 
       return player 
     return None 

    def __str__(self): 
     return 'a golf league with ' + str(self.getNumPlayers()) + ' players' 



def main(): 
    """The input and output for the program""" 
    l= League() 
    players= [] 
    enterScores(l, players, position) 
    isValidScore(holeScores) 
    output(players) 


def enterScores(l, players, position): 
    """enter the scores""" 
    for position in range(l.getNumPlayers()): 
     holeScores= input(("Please enter a list of the player's scores: ")) 
     while not isValidScore(holeScores): 
      holeScores= input(("Please enter a valid list of scores: ")) 
     p= l.getPlayerbyPosition(position) 
     players.append(p) 
     p.recordScores(holeScores) 


def isValidScore(holeScores): 
    """checks if the scores entered for a single hole are 1 to 10, inclusive""" 
    for score in holeScores: 
     if score == 1 or 2 or 3 or 4 or 5 or 6 or 7 or 8 or 9 or 10: 
      return True 
     else: 
      return False     


def output(grossScore, pars, birdies): 
    """prints output""" 
    for player in players: 
     print(player.getName()) 
     print('Gross score:', player.getGross()) 
     print('Pars: ', player.getPars()) 
     print('Birdies: ', player.getBirdies()) 
+0

Il semble que vous passez dans une liste mixte de chaînes et d'entiers, que Python se plaint de ne pas pouvoir ajouter ensemble. – tacaswell

Répondre

1

Si vous utilisez Python 3, holeScores est une chaîne, pas un entier. Vous devez en faire une liste des numéros:

user_input = input("Please enter a valid list of scores: ") 
holeScores = [int(score) for score in user_input.split()] 

cette ligne ne fait pas aussi, ce que vous pensez qu'il fait:

if score == 1 or 2 or 3 or 4 or 5 or 6 or 7 or 8 or 9 or 10: 

Elle sera évaluée comme:

if (score == 1) or (2) or ... 

Qui évaluera à True. Il suffit de le faire à la place:

for score in scores: 
    if not (1 <= score <= 10): 
     return False 

return True 
+0

Merci qui a du sens. Cependant, il me donne maintenant une erreur de syntaxe invalide et met en surbrillance 'while' de la boucle while. A-t-il besoin d'être différemment différé maintenant? – tinydancer9454

+0

@ tinydancer9454: Quelle est la traceback complète? – Blender

+0

Cette boucle est bien. Cependant, il s'agit essentiellement d'une version manuelle de la fonction intégrée ['all()'] (http://docs.python.org/2/library/functions.html#all). Avec cela, vous pouvez écrire juste 'all (1 <= score <= 10 pour le score dans holeScores)'. –

Questions connexes