"""Snowshoe race report: a functional-decomposition example."""
RESULTS = ["Amara,312", "Ben,298", "Chloé,305", "Dev,330"]
def parse_line(line):
"""Split "name,seconds" into a (name, seconds) tuple."""
name, secs = line.split(",")
return name, int(secs)
def parse_all(lines):
"""Return a list of (name, seconds) tuples, one per line."""
results = []
for line in lines:
results.append(parse_line(line))
return results
def by_time(result):
"""Sort key: the seconds part of a (name, seconds) tuple."""
return result[1]
def rank(results):
"""Return a new list sorted from fastest to slowest."""
return sorted(results, key=by_time)
def average_seconds(results):
"""Return the mean time in seconds (results must not be empty)."""
total = 0
for name, secs in results:
total += secs
return total / len(results)
def format_time(seconds):
"""Turn a whole number of seconds into "m:ss" text."""
return f"{seconds // 60}:{seconds % 60:02d}"
def print_report(ranked, avg):
"""Display the ranked results and the average time."""
print("Snowshoe race results")
for place, (name, secs) in enumerate(ranked, start=1):
print(f"{place}. {name:<8} {format_time(secs)}")
print("Average time:", format_time(round(avg)))
def main():
results = parse_all(RESULTS)
ranked = rank(results)
print_report(ranked, average_seconds(results))
main()
race_report.py: every function has one job, and only print_report() prints.