|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
请问为什么我运行之后会报错?试了好几次都不管用
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- """
- 学生成绩分析器
- 读取成绩表,输出每位同学的总分、平均分、排名、不及格科目,
- 以及各科目的年级平均分。
- """
- SUBJECTS = ["语文", "数学", "英语", "物理", "化学"]
- DATA = [
- ["张三", 88, 92, 79, 85, 90],
- ["李四", 76, 85, 88, 70, 82],
- ["王五", 95, 78, 92, 88, 76],
- ["赵六", 62, 70, 65, 58], # 化学缺考
- ["孙七", 81, 88, 84, 91, 87],
- ]
- def parse(rows):
- """把原始二维表转成 {姓名: {科目: 分数}}"""
- students = {}
- for row in rows:
- name = row[0]
- scores = dict(zip(SUBJECTS, row[1:]))
- students[name] = scores
- return students
- def total_score(scores):
- """个人总分"""
- return sum(scores.values())
- def average_score(scores):
- """个人平均分"""
- return total_score(scores) / len(scores)
- def subject_average(students, subject):
- """某科目的年级平均分"""
- vals = [scores[subject] for scores in students.values()]
- return sum(vals) / len(vals)
- def failed_subjects(scores, threshold=60):
- """返回不及格的科目列表"""
- return [sub for sub, score in scores.items() if score < threshold]
- def rank_students(students):
- """按平均分从高到低排序,返回 [(姓名, 分数字典), ...]"""
- return sorted(
- students.items(),
- key=lambda kv: average_score(kv[1]),
- reverse=True,
- )
- def top_n(students, n):
- """取平均分前 n 名"""
- ranked = rank_students(students)
- return ranked[:n]
- def print_report(students):
- """打印完整报表"""
- line = "-" * 48
- print("=" * 48)
- print(f"{'姓名':<8}{'总分':>8}{'平均分':>12}{'不及格科目':>16}")
- print(line)
- ranked = rank_students(students)
- for i, (name, scores) in enumerate(ranked):
- failed = failed_subjects(scores)
- fail_str = "、".join(failed) if failed else "无"
- print(f"{name:<8}{total_score(scores):>8}"
- f"{average_score(scores):>12.2f}{fail_str:>16}")
- print(line)
- print("各科平均分:")
- for subject in SUBJECTS:
- print(f" {subject:<4}{subject_average(students, subject):>8.2f}")
- print("=" * 48)
- def main():
- students = parse(DATA)
- print_report(students)
- print()
- print("平均分前 3 名:")
- for name, scores in top_n(students, 3):
- print(f" {name} {average_score(scores):.2f}")
- if __name__ == "__main__":
- main()
复制代码
球球各位鱼油帮帮吧
你这段代码报错,最直接的原因是:你贴到论坛后,很多方括号内容被吞掉了,代码已经不完整。
比如 SUBJECTS = 后面应该有一个科目列表; DATA 里每行也应该有数据; name = row 应该是取第 0 个元素; students = scores 应该改成用姓名做键; average_score(kv) 应该传分数字典。少了这些,Python 会报 SyntaxError 或 TypeError。
另外,缺考用 None 时,总分、平均分、科目平均分都要跳过 None,否则也会报错。
关键修复如下:
- SUBJECTS = ["语文", "数学", "英语", "物理", "化学"]
- DATA = [
- ["张三", 90, 85, 78, 92, None],
- ["李四", 70, 60, 88, 55, 80],
- ]
- def parse(rows):
- students = {}
- for row in rows:
- name = row[0]
- scores = dict(zip(SUBJECTS, row[1:]))
- students[name] = scores
- return students
- def total_score(scores):
- return sum(v for v in scores.values() if v is not None)
- def average_score(scores):
- vals = [v for v in scores.values() if v is not None]
- return sum(vals) / len(vals)
- def subject_average(students, subject):
- vals = [s[subject] for s in students.values() if s[subject] is not None]
- return sum(vals) / len(vals)
- def failed_subjects(scores, threshold=60):
- return [subject for subject, score in scores.items()
- if score is not None and score < threshold]
- def rank_students(students):
- return sorted(
- students.items(),
- key=lambda kv: average_score(kv[1]),
- reverse=True,
- )
- def top_n(students, n):
- ranked = rank_students(students)
- return ranked[:n]
复制代码
把上面这些地方补完整,再运行一般就不会报错了。以后在论坛发代码,记得用论坛的代码标签包起来,否则方括号里的内容会被吃掉。如果还报错,把完整报错信息发出来。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|