上面是一场真实的高尔夫足球赛的得分记录,得分最低者胜出。各参赛选手的得分情况以姓名 + ':'/':' + 各分项得分进行记录,且各分项得分之间以一个或多个空格间隔,得分情况可以记录在一个字符串中,也可以记录在一个名为“scores.txt”的文本文件(详见scores.txt)中。试基于 OOP 编写 Python 程序: (1) 计算并输出每位选手的总得分;(2) 输出胜出的选手,并且在计算胜出选手时,不可以使用系统提供的 min/max 函数。 2. 系统实现 Python class AnalyScore: def __init__(self, all_scores): """ all_scores can be a string or a text file""" self.all_scores = self.read_scores(all_scores) pass def read_scores(self, all_scores): pass def parse_scores(self): pass def print_scores(self): pass def report_winner(self): pass def __call__(self): self.parse_scores() self.print_scores() self.report_winner() if __name__ == '__main__': player_scores = '\ 李:17 6 3 3 2 5 3 6 8\ 楼: 6 9 5 10 14 3 8 4 6\ 翁:3 4 8 9 3 5 4 6 6' AnalyScore(player_scores)() print() AnalyScore('scores.txt')()
时间: 2024-02-07 07:04:10 浏览: 164
2017-PGA巡回赛杆数分析:使用2017 PGA巡回赛数据来查看高尔夫球手能力的一部分是否比另一部分更能说明得分低
很好,这是一个有趣的问题!这里是代码实现:
```python
class AnalyScore:
def __init__(self, all_scores):
self.all_scores = self.read_scores(all_scores)
def read_scores(self, all_scores):
if isinstance(all_scores, str):
return all_scores.split('\n')
else:
with open(all_scores, 'r') as f:
return f.readlines()
def parse_scores(self):
self.scores_dict = {}
for s in self.all_scores:
name, scores_str = s.split(':')
scores = [int(score) for score in scores_str.split()]
self.scores_dict[name] = scores
def print_scores(self):
for name, scores in self.scores_dict.items():
total_score = sum(scores)
print(f'{name}的总得分是{total_score}')
def report_winner(self):
winner = None
winner_score = float('inf')
for name, scores in self.scores_dict.items():
total_score = sum(scores)
if total_score < winner_score:
winner = name
winner_score = total_score
print(f'胜出者是{winner}')
def __call__(self):
self.parse_scores()
self.print_scores()
self.report_winner()
if __name__ == '__main__':
player_scores = '''李:17 6 3 3 2 5 3 6 8
楼: 6 9 5 10 14 3 8 4 6
翁:3 4 8 9 3 5 4 6 6'''
AnalyScore(player_scores)()
print()
AnalyScore('scores.txt')()
```
这个类的实例化需要一个字符串或者一个文本文件,因为我们需要读取得分记录。`read_scores` 方法负责读取得分记录,如果输入的是字符串,则使用 `split` 方法进行分割,如果输入的是文件名,则使用 `readlines` 方法读取。
`parse_scores` 方法负责将得分记录解析成一个字典,字典的键是选手的姓名,字典的值是一个得分列表。
`print_scores` 方法负责计算并输出每位选手的总得分。
`report_winner` 方法负责计算胜出的选手,并且在计算胜出选手时,不能使用系统提供的 `min/max` 函数。我们可以使用 `float('inf')` 来表示一个正无穷大的数,然后遍历字典,找到得分最低的选手。
`__call__` 方法负责调用其他方法,按照题目要求的顺序,依次输出每位选手的总得分,胜出的选手。
阅读全文