繁体   English   中英

python'NoneType'对象不可迭代

[英]python 'NoneType' object is not iterable

该程序是高尔夫球比赛的用户界面。 玩家和联赛类别不应更改。 用户界面允许用户在文本文件中为每个球员输入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())

main您将enterScore的返回值分配给holeScores ,并且它为None因为enterScore没有return语句。 因此,将None传递给isValidScore ,该方法尝试在for循环中对其进行迭代,但失败了,因为None可以循环的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM