鱼C论坛

 找回密码
 立即注册
查看: 20|回复: 3

[已解决]为什么这段代码会报错啊?

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请问为什么我运行之后会报错?试了好几次都不管用
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. 学生成绩分析器
  5. 读取成绩表,输出每位同学的总分、平均分、排名、不及格科目,
  6. 以及各科目的年级平均分。
  7. """

  8. SUBJECTS = ["语文", "数学", "英语", "物理", "化学"]

  9. DATA = [
  10.     ["张三", 88, 92, 79, 85, 90],
  11.     ["李四", 76, 85, 88, 70, 82],
  12.     ["王五", 95, 78, 92, 88, 76],
  13.     ["赵六", 62, 70, 65, 58],          # 化学缺考
  14.     ["孙七", 81, 88, 84, 91, 87],
  15. ]


  16. def parse(rows):
  17.     """把原始二维表转成 {姓名: {科目: 分数}}"""
  18.     students = {}
  19.     for row in rows:
  20.         name = row[0]
  21.         scores = dict(zip(SUBJECTS, row[1:]))
  22.         students[name] = scores
  23.     return students


  24. def total_score(scores):
  25.     """个人总分"""
  26.     return sum(scores.values())


  27. def average_score(scores):
  28.     """个人平均分"""
  29.     return total_score(scores) / len(scores)


  30. def subject_average(students, subject):
  31.     """某科目的年级平均分"""
  32.     vals = [scores[subject] for scores in students.values()]
  33.     return sum(vals) / len(vals)


  34. def failed_subjects(scores, threshold=60):
  35.     """返回不及格的科目列表"""
  36.     return [sub for sub, score in scores.items() if score < threshold]


  37. def rank_students(students):
  38.     """按平均分从高到低排序,返回 [(姓名, 分数字典), ...]"""
  39.     return sorted(
  40.         students.items(),
  41.         key=lambda kv: average_score(kv[1]),
  42.         reverse=True,
  43.     )


  44. def top_n(students, n):
  45.     """取平均分前 n 名"""
  46.     ranked = rank_students(students)
  47.     return ranked[:n]


  48. def print_report(students):
  49.     """打印完整报表"""
  50.     line = "-" * 48
  51.     print("=" * 48)
  52.     print(f"{'姓名':<8}{'总分':>8}{'平均分':>12}{'不及格科目':>16}")
  53.     print(line)

  54.     ranked = rank_students(students)
  55.     for i, (name, scores) in enumerate(ranked):
  56.         failed = failed_subjects(scores)
  57.         fail_str = "、".join(failed) if failed else "无"
  58.         print(f"{name:<8}{total_score(scores):>8}"
  59.               f"{average_score(scores):>12.2f}{fail_str:>16}")

  60.     print(line)
  61.     print("各科平均分:")
  62.     for subject in SUBJECTS:
  63.         print(f"  {subject:<4}{subject_average(students, subject):>8.2f}")
  64.     print("=" * 48)


  65. def main():
  66.     students = parse(DATA)
  67.     print_report(students)

  68.     print()
  69.     print("平均分前 3 名:")
  70.     for name, scores in top_n(students, 3):
  71.         print(f"  {name}  {average_score(scores):.2f}")


  72. if __name__ == "__main__":
  73.     main()
复制代码

球球各位鱼油帮帮吧
最佳答案
7 天前
你这段代码报错,最直接的原因是:你贴到论坛后,很多方括号内容被吞掉了,代码已经不完整。

比如 SUBJECTS = 后面应该有一个科目列表;DATA 里每行也应该有数据;name = row 应该是取第 0 个元素;students = scores 应该改成用姓名做键;average_score(kv) 应该传分数字典。少了这些,Python 会报 SyntaxError 或 TypeError。

另外,缺考用 None 时,总分、平均分、科目平均分都要跳过 None,否则也会报错。

关键修复如下:

  1. SUBJECTS = ["语文", "数学", "英语", "物理", "化学"]

  2. DATA = [
  3.     ["张三", 90, 85, 78, 92, None],
  4.     ["李四", 70, 60, 88, 55, 80],
  5. ]

  6. def parse(rows):
  7.     students = {}
  8.     for row in rows:
  9.         name = row[0]
  10.         scores = dict(zip(SUBJECTS, row[1:]))
  11.         students[name] = scores
  12.     return students

  13. def total_score(scores):
  14.     return sum(v for v in scores.values() if v is not None)

  15. def average_score(scores):
  16.     vals = [v for v in scores.values() if v is not None]
  17.     return sum(vals) / len(vals)

  18. def subject_average(students, subject):
  19.     vals = [s[subject] for s in students.values() if s[subject] is not None]
  20.     return sum(vals) / len(vals)

  21. def failed_subjects(scores, threshold=60):
  22.     return [subject for subject, score in scores.items()
  23.             if score is not None and score < threshold]

  24. def rank_students(students):
  25.     return sorted(
  26.         students.items(),
  27.         key=lambda kv: average_score(kv[1]),
  28.         reverse=True,
  29.     )

  30. def top_n(students, n):
  31.     ranked = rank_students(students)
  32.     return ranked[:n]
复制代码


把上面这些地方补完整,再运行一般就不会报错了。以后在论坛发代码,记得用论坛的代码标签包起来,否则方括号里的内容会被吃掉。如果还报错,把完整报错信息发出来。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层    本楼为最佳答案   
你这段代码报错,最直接的原因是:你贴到论坛后,很多方括号内容被吞掉了,代码已经不完整。

比如 SUBJECTS = 后面应该有一个科目列表;DATA 里每行也应该有数据;name = row 应该是取第 0 个元素;students = scores 应该改成用姓名做键;average_score(kv) 应该传分数字典。少了这些,Python 会报 SyntaxError 或 TypeError。

另外,缺考用 None 时,总分、平均分、科目平均分都要跳过 None,否则也会报错。

关键修复如下:

  1. SUBJECTS = ["语文", "数学", "英语", "物理", "化学"]

  2. DATA = [
  3.     ["张三", 90, 85, 78, 92, None],
  4.     ["李四", 70, 60, 88, 55, 80],
  5. ]

  6. def parse(rows):
  7.     students = {}
  8.     for row in rows:
  9.         name = row[0]
  10.         scores = dict(zip(SUBJECTS, row[1:]))
  11.         students[name] = scores
  12.     return students

  13. def total_score(scores):
  14.     return sum(v for v in scores.values() if v is not None)

  15. def average_score(scores):
  16.     vals = [v for v in scores.values() if v is not None]
  17.     return sum(vals) / len(vals)

  18. def subject_average(students, subject):
  19.     vals = [s[subject] for s in students.values() if s[subject] is not None]
  20.     return sum(vals) / len(vals)

  21. def failed_subjects(scores, threshold=60):
  22.     return [subject for subject, score in scores.items()
  23.             if score is not None and score < threshold]

  24. def rank_students(students):
  25.     return sorted(
  26.         students.items(),
  27.         key=lambda kv: average_score(kv[1]),
  28.         reverse=True,
  29.     )

  30. def top_n(students, n):
  31.     ranked = rank_students(students)
  32.     return ranked[:n]
复制代码


把上面这些地方补完整,再运行一般就不会报错了。以后在论坛发代码,记得用论坛的代码标签包起来,否则方括号里的内容会被吃掉。如果还报错,把完整报错信息发出来。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
谢谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层


不客气,能帮到你就好!以后贴代码记得用论坛的 代码标签 包住,避免方括号内容被吞。遇到新报错,把完整报错信息发出来就行。加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-10-11 04:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表