0

このプログラムは、ゴルフ ラウンドのユーザー インターフェイスです。Player クラスと League クラスは変更しないでください。ユーザー インターフェイスでは、テキスト ファイルにプレーヤーごとに 9 つのホール スコアを入力でき、各プレーヤーのグロス スコア、パー、バーディーを返します。スコアの最後のセットが入力された後にこのエラーが発生します (修正方法がわかりません)。スコアが入力されたときにスコアを検証しているように見えますが、最後にスコアも検証しているようです。もうありません。入力後にチェックされるようにする必要があり、それだけです。これを行う方法がわからない

Traceback (most recent call last):
  File "<pyshell#41>", line 1, in <module>
    main()
  File "/Users/tinydancer9454/Documents/python/golfRound.py", line 102, in main
    isValidScore(holeScores)
  File "/Users/tinydancer9454/Documents/python/golfRound.py", line 120, in isValidScore
    for score in holeScores:
TypeError: 'NoneType' object is not iterable

コードは次のとおりです。

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= []
    holeScores= enterScores(l, players)
    isValidScore(holeScores)
    output(players)


def enterScores(l, players):
    """enter the scores"""
    for position in range(l.getNumPlayers()):
        inputScore= input("Please enter a list of the player's scores: ")
        holeScores= (int(score) for score in inputScore.split(','))
        for score in holeScores:
            while not isValidScore(holeScores):
                holeScores= input("Please enter a valid list of scores: ")
        p= l.getPlayerbyPosition(position)
        players.append(p.recordScores(holeScores))
        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 not int:
            return False
        elif score < 1:
            return False
        elif score > 10:
            return False
    return True


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

1 に答える 1

1

inmainの戻り値をenterScoretoholeScoresに代入しますが、これはステートメントがないNoneためです。に渡され、ループ内で反復しようとしますが、ループできるものではないため失敗します。enterScorereturnNoneisValidScoreforNone

于 2013-04-04T03:01:54.643 に答える