大耳朵老鼠 发表于 7 天前

为什么这段代码会报错啊?

请问为什么我运行之后会报错?试了好几次都不管用
#!/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
      scores = dict(zip(SUBJECTS, row))
      students = 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 = for scores in students.values()]
    return sum(vals) / len(vals)


def failed_subjects(scores, threshold=60):
    """返回不及格的科目列表"""
    return


def rank_students(students):
    """按平均分从高到低排序,返回 [(姓名, 分数字典), ...]"""
    return sorted(
      students.items(),
      key=lambda kv: average_score(kv),
      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()
球球各位鱼油帮帮吧

FishC 发表于 7 天前

你这段代码报错,最直接的原因是:你贴到论坛后,很多方括号内容被吞掉了,代码已经不完整。

比如 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
      scores = dict(zip(SUBJECTS, row))
      students = 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 =
    return sum(vals) / len(vals)

def subject_average(students, subject):
    vals = for s in students.values() if s 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),
      reverse=True,
    )

def top_n(students, n):
    ranked = rank_students(students)
    return ranked[:n]


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

大耳朵老鼠 发表于 7 天前

谢谢!!!

FishC 发表于 7 天前

大耳朵老鼠 发表于 2026-10-04 21:17
谢谢!!!

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 为什么这段代码会报错啊?