1. 引言
随着人工智能的快速发展,Python语言在各领域的广泛应用,其在教育领域的地位也日益凸显,成为众多高校的热门编程语言课程。然而,如何科学、有效地评估学生的Python编程能力一直是教学过程中的关键问题。传统的Python编程考试通常采用单一的判分模式,往往侧重于程序的最终输出结果,而这种方式在一定程度上忽视了学生在编程过程中展现出的思维能力、代码组织能力和对编程规范的遵循,难以全面、准确地反映学生的真实水平。因此,开展基于多种判分模式的Python编程考试研究具有深远的理论和现实意义,有助于完善Python编程教育的评估体系,为培养高素质的Python编程人才提供更好的支持[1]-[4]。
2. 传统结果导向判分模式的局限性
2.1. 投机取巧猜答案
在传统的Python编程考试中,结果导向判分是最常见的模式,即仅根据程序运行的最终输出是否与标准答案一致来评判学生的成绩。这种判分方式的优点在于简单易行,能够快速得出分数,尤其适合于一些具有明确结果的简单程序。例如,对于一个计算斐波那契数列第n项的程序,教师只需要将学生程序运行结果与正确答案进行对比即可[3]。
def fibonacci_wrong(n):
if n == 1:
return 1
elif n == 2:
return 1
elif n == 3:
return 2
elif n == 4:
return 3
elif n == 5:
return 5
# 以此类推
然而这种判分模式存在严重的局限性。首先,它容易导致学生为了追求正确结果而不择手段,例如使用一些“投机取巧”的方法。例如,对于上述斐波那契数列的计算,如果学生直接硬编码几个已知结果,而不是使用算法来计算,也可能得到正确答案,但实际上并未掌握算法逻辑。
这种情况使得学生可能在不理解编程概念和算法的基础上,通过简单记忆或试错法得到正确结果,从而无法真正考查学生的编程能力,尤其是对于更复杂的编程任务,如数据处理、算法设计和系统开发等,结果导向判分难以评估学生的逻辑思维和算法应用能力。
2.2. 忽略代码质量与可读性
结果导向判分无法体现学生在编程过程中的思路演变、解决问题的步骤以及对问题的理解深度。同时,对于代码的规范性和质量,包括变量命名、代码注释、代码结构、函数封装、异常处理等方面也没有考量。良好的编程习惯对于代码的可读性、可维护性以及团队协作至关重要,但在传统判分模式下,这些重要的编程素养往往被忽视[5]。例如,以下两个实现相同功能的代码片段:
def a(x):
r = 1
for i in range(1, x + 1):
r = r * i
return r
def factorial(n):
"""
此函数用于计算n的阶乘
参数n:输入的整数
函数返回:n的阶乘结果
"""
result = 1
if n < 0:
raise ValueError ("输入应为非负整数")
for i in range(1, n + 1):
result *= i
return result
在结果导向判分中,它们可能获得相同的分数,但从代码质量和编程习惯来看,第二个代码片段明显优于第一个,包含了函数的注释、输入参数的验证和异常处理,展现了更好的编程素养。
2.3. 评分标准不够全面
编程作品的评价实际上是一个多维度的综合考量过程,它不仅包括代码的正确性这一基础要素,还涉及代码的可读性、性能优化等多个层面。这些关键因素都应当在评分标准中得到充分且合理的体现,以确保评价结果的公正性和客观性[6]。
特别是在面对多步骤的复杂编程任务时,学生可能在某些环节表现出色,但由于某个特定环节的失误,导致最终的输出结果出现错误。在这种情况下,现有的判分机制往往无法灵活地给予学生部分分数,这种“一刀切”的评价方式不仅无法真实反映学生的实际能力和努力程度,还可能严重挫伤学生的学习积极性和自信心,进而影响他们的学习动力和长远发展。因此,亟需对评分标准进行细化和完善,以更好地激励和引导学生不断提升编程技能。
3. 多种判分模式的探讨
3.1. 结果判分模式
Python编程题结果判分模式是一种以程序运行输出为核心依据的自动化评分机制[2] [7]。该模式通过预设测试用例,将学生提交代码的执行结果与预期输出进行比对,根据匹配程度给予分数。其核心逻辑在于验证程序的功能正确性,而非代码实现细节。例如,对于“计算1到100的整数和”的题目,学生可能写出以下两种代码:
# 方法一:使用循环
total = 0
for i in range(1, 101):
total += i
print(total)
# 方法二:使用数学公式
print(sum(range(1, 101)))
结果判分模式下,只要输出结果为5050,两种实现均视为正确。这种模式的优势在于客观性强、评分效率高,适合大规模考试场景。现代判分系统通常采用黑盒测试,即隐藏测试用例的具体输入,要求代码在多种场景下均能正确运行。例如测试排序函数时,会覆盖空列表、已排序列表、逆序列表等边界情况。
结果判分模式优点在于判分的高效性和客观性,尤其是对于简单程序或功能明确的程序,能够快速准确地确定学生是否实现了基本功能。但这种模式的缺点也很明显,它只能判断最终结果是否正确,无法评估学生对问题的思考过程和解决思路,导致学生忽视编程规范和代码质量,为了通过测试而采取一些不合理的编程手段。
3.2. 过程判分模式
过程判分模式旨在评估学生解决问题的步骤和思维过程,主要用于对较复杂的算法类程序题进行判分。一种常见的方式是要求学生在代码中添加详细的注释,解释关键代码的功能和思路。以一个使用递归实现的汉诺塔问题的程序为例:
def hanoi(n, source, auxiliary, target):
"""
该函数使用递归算法解决汉诺塔问题
:param n:盘子的数量
:param source:源柱子
:param auxiliary:辅助柱子
:param target:目标柱子
"""
if n == 1: # 递归终止条件:只有一个盘子时直接移动
print(f"Move disk1 from {source} to {target}")
return
# 将n − 1个盘子从源柱子移动到辅助柱子
hanoi(n − 1, source, target, auxiliary)
# 将最大的盘子从源柱子移动到目标柱子
print(f"Move disk{n} from {source} to {target}")
# 将n − 1个盘子从辅助柱子移动到目标柱子
hanoi(n − 1, auxiliary, source, target)
教师可以根据学生的注释是否清晰准确、关键步骤的实现思路是否正确以及对递归思想的理解程度来给分。过程判分的优点在于能够深入了解学生的编程思路,引导学生注重编程逻辑和算法的实现细节,鼓励学生以更清晰、合理的方式解决问题。然而,这种模式判分过程相对主观,不同教师对学生注释和中间步骤的理解可能存在差异,并且需要花费大量时间阅读和理解学生的代码和注释,判分效率较低。
3.3. 代码质量判分模式
Python编程题的代码质量判分模式是指除了能否通过测试用例这一正确性维度之外,再按一系列代码质量指标给出额外分数(或扣分),从而鼓励考生写出易读、易维护、优雅的代码。代码质量判分主要关注代码的规范性、可读性、可维护性和代码结构等。可以从多个维度进行评估,如简洁性、结构组织、命名规范、注释与文档、复杂度、鲁棒性等,如表1所示。
Table 1. Examples of common quality dimensions and scoring weights
表1. 常见质量维度与判分权重示例
维度 |
含义 |
典型权重 |
检查要点 |
简洁性 |
无冗余、不过度设计 |
20% |
行数、重复代码、Pythonic用法 |
结构组织 |
模块化、函数粒度合理 |
20% |
是否拆分函数/类、单一职责 |
命名规范 |
变量/函数可读 |
20% |
snake_case、CamelCase、语义清晰 |
复杂度 |
程序复杂度、嵌套深度 |
20% |
避免多层if、for |
鲁棒性 |
异常处理、防御式编程 |
20% |
try...except、输入校验 |
答案A (答案正确但代码质量一般):
def is_palindrome(s):
s = s.lower()
news = ''
for ch in s:
if ch.isalpha():
news += ch
return news == news[::−1]
质量评分如下:
1. 简洁性:10/20 (多余变量、低效拼接)
2. 结构组织:10/20 (未拆分清洗逻辑)
3. 命名:14/20 (news语义不明)
4. 复杂度:16/20 (单循环尚可)
5. 鲁棒性:15/20 (无异常)
质量总分:65。
答案B (正确且高质量):
import re
def _normalize(text: str) -> str:
"""只保留字母并转小写"""
return re.sub(r'[^a-z]', '', text.lower())
def is_palindrome(s: str) -> bool:
"""
判断忽略大小写及非字母后的回文。
空字符串视为回文。
"""
normalized = _normalize(s)
return normalized == normalized[::−1]
质量评分:
1. 简洁性:20/20 (正则一行完成过滤)
2. 结构组织:20/20 (职责拆分清晰)
3. 命名:20/20 (语义明确)
4. 复杂度:20/20 (扁平)
5. 鲁棒性:16/20 (仍无异常捕获,但正则足够)
质量总分:96。
代码质量判分的优点是可以培养学生良好的编程习惯,提高代码的可读性和可维护性,这对于学生未来的编程职业发展至关重要。但缺点是判分标准难以精确量化,不同教师对代码质量的评判标准可能存在一定差异,并且手动评估代码质量需要大量时间和精力。
4. 多种判分模式的组合设计
4.1. 组合方案的设计原则
基于不同判分模式的优缺点可以设计多种判分模式的组合方案,需要根据不同类型的编程任务和教学目标进行灵活调整。本研究提出一个整合结果判分、过程判分与代码质量判分的综合判分系统,构建覆盖功能实现、思维过程与代码规范的立体评价体系,弥补传统方法对非功能性要求的评估盲区。一般而言,对于基础知识类题目,如基本语法、简单函数实现等,可以适当提高结果判分的比重;对于算法设计和复杂问题解决类题目,过程判分和代码质量判分的比重应相应增加。因此,对于Python编程考试,可以设计如下的组合判分方案:
1. 基础编程题目(如基本数据类型操作、简单函数实现):结果判分占60%,代码质量判分占30%,过程判分占10%。
2. 算法和数据结构题目(如排序、搜索算法):结果判分占40%,代码质量判分占30%,过程判分占30%。
3. 综合应用题目(如开发一个小型应用程序):结果判分占30%,代码质量判分占40%,过程判分占30%。
4.2. 具体实践案例
以某高校Python编程课程期末考试中的编程题为例,试卷包括三类编程题:基础编程题、算法和数据结构题和综合应用题。下面以算法和数据结构题目为例,说明具体的判分方案实施细则。
考查排序算法,要求学生实现快速排序算法并解释其工作原理。对于结果判分,使用多组测试数据进行测试,占40%;对于过程判分,要求学生在关键代码处添加注释解释算法的分区和递归调用,根据注释的完整性和准确性进行过程判分,占30%;对于质量判分,根据代码的结构、函数的封装、变量命名和异常处理进行代码质量判分,占30%。以下是某学生答题代码,算法和数据结构题判分组合方案如表2所示。
def quick_sort(arr):
"""
此函数使用快速排序算法对数组进行排序
:paramarr:输入数组
:return:排序好的数组
"""
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
# 递归调用快速排序
return quick_sort(left) + middle + quick_sort(right)
Table 2. Scoring combination scheme for algorithms and data structures questions
表2. 算法和数据结构题判分组合方案
评分维度 |
占比 |
评分细则与检查结果 |
得分 |
结果判分(正确性) |
40% |
多组测试数据:正确输出;列表推导式实现
快排,功能等价于经典快排。 |
40/40 |
过程判分(注释完整性、准确性) |
30% |
仅在最外层docstring中给出总述,未在分区、递归处逐行解释。 |
15/30 |
代码质量判分(结构、封装、命名、
异常处理) |
30% |
结构简洁,但全部逻辑挤在一个函数。 |
20/30 |
总分 |
75分 |
通过这种组合判分模式,能够更全面地评估学生的编程能力,从不同维度对学生的表现进行考量,避免单一判分模式的片面性。
5. AI大模型辅助判分
5.1. 过程判分和代码质量判分存在的问题
1) 判分效率低下
以上组合设计方案中,在过程判分和代码质量判分环节高度依赖人工,教师必须逐行阅读学生代码,核对注释是否逻辑严谨、变量命名是否规范、函数是否拆分合理,再给出0~30不等的细粒度得分。当考生人数从几十人膨胀到几千人时,这种“显微镜式”审阅立刻暴露出人力瓶颈,假设平均一份代码耗时3~5分钟,一位教师一天只能处理100份左右;若同时有2000名考生,仅这两个维度就要消耗10名教师整整两天,成绩反馈周期被拉长,严重影响教学闭环。
2) 不同教师评分标准难统一
在大规模考试情况下,过程判分与代码质量判分高度依赖教师个人经验,导致评分标准千人千面。例如,对关键注释的界定,有的教师要求每一步递归都须逐行说明,缺一则扣五分;有的教师则认为整体思路清晰即可,仅象征性扣一分。又如函数拆分,部分教师把“超过二十行即视为臃肿”作为硬性红线,另一部分教师却放宽至三十行,造成同一份代码在不同阅卷人手中分差可达十至十五分。变量命名、异常处理、复杂度解释等维度亦存在类似松紧差异。标准不统一不仅引发学生质疑与申诉,严重削弱考试公平性。
5.2. AI大模型辅助判分
近年来,大型语言模型(LLM)为编程评估注入新活力[8] [9]。研究表明,CodeBERT等预训练模型可通过代码语义理解评估逻辑正确性,而GPT-4等生成式模型可模拟人类评审行为,对代码注释、异常处理等维度进行自然语言反馈。本研究立足于多维度评估框架与LLM技术融合的交叉点,针对教育场景优化LLM应用,通过Prompt工程将主观评分维度转化为可执行的量化规则。
大语言模型通过把过程判分规则与代码质量指标转化为可执行的提示词,教师可让LLM扮演“AI助教”,对每份代码进行秒级扫描,自动识别关键算法步骤是否配有注释、检测函数粒度、评估命名可读性,再按权重输出0~100的量化分数。同时输出可解释文本,如:指出“第17行缺少对分区边界的解释”、“函数quick_sort超过50行未拆分”等具体改进点。
某高校《Python程序设计》期末机试中,学校利用大模型构建判卷流水线智能体:第一步,LLM读取每份源码,依据教师给定的Rubric逐项打分;第二步,LLM将过程判分与质量判分结果写入JSON,回传教学平台;第三步,平台自动汇总生成班级雷达图,标出“注释薄弱”“无异常捕获”高频问题。最终,AI初筛发现95%的学生代码可直接采信,剩余5%的争议卷由3名教师半日即复审完毕。
系统采用GPT-4 Turbo作为基础模型,其代码理解能力与长文本处理能力可满足复杂代码分析需求。核心Prompt设计遵循“分维度解析 + 量化打分”原则,AI判分Prompt模板示例如下:
你是一位Python代码评审专家,请根据表3的AI辅助判分Rubric对学生代码进行质量评估:
Table 3. Example of AI-assisted scoring Rubric
表3. AI辅助判分Rubric示例
评分维度 |
占比 |
满分标准 |
扣分规则 |
过程注释 |
30% |
关键步骤注释完整且准确 |
每处缺失扣5分,最多扣30分 |
函数拆分 |
20% |
函数行数 ≤ 20行 |
超1行扣1分,最多扣20分 |
变量命名 |
15% |
全部符合snake_case且语义明确 |
每处违规扣3分,最多扣15分 |
异常处理 |
20% |
输入校验与异常捕获完备 |
未处理扣20分 |
复杂度控制 |
15% |
循环嵌套 ≤ 2层,无重复代码 |
每多一层嵌套扣5分,最多扣15分 |
请输出JSON格式的评分结果,包含总分与各维度扣分理由。
学生代码:{student_code}
最后根据大模型生成的代码质量和过程评分结果按照相应的权重计算出学生代码的总得分。
2. 准确性验证方法
为验证AI评分的可靠性,设计双盲实验:
(1) 样本选择:随机抽取30份代码(含高、中、低分各10份)。
(2) 专家评分:由3名资深教师独立评分,取平均分作为基准。
(3) AI评分:使用上述Prompt生成AI评分。
最终通过比较AI评分与3位专家评分进行交叉验证,误差分值在可接受范围之内。
6. 实验结果
6.1. 实验设计
为验证多模式判分方案的有效性,我们在某高校2024~2025学年第二学期《Python程序设计》课程中开展对照实验。实验对象为两个平行班(共82人),随机分为对照组(n = 41,传统结果判分)与实验组(n = 41,多模式判分)。两组教学大纲、习题难度、授课教师完全一致,仅考试评分方式不同。实验组采用“结果判分40% + 过程判分30% + 代码质量判分30%”的组合方案,对照组仅保留结果判分。
6.2. 数据分析
1) 成绩对比
实验组期末编程题平均分(78.2 ± 6.3)显著高于对照组(72.1 ± 5.8),尤其在算法设计类题目中差距明显(实验组85.6 vs对照组76.4)。代码质量维度得分差异最大(实验组23.8/30 vs对照组15.2/30),体现多模式判分对编程习惯的引导作用。
2) 学习行为变化
实验组学生代码提交次数增加27%,错误率降低19%,且更倾向于使用函数封装(实验组代码行数 ≤ 20行的函数占比68% vs对照组42%),表明更注重问题分解与逻辑验证。
3) 反馈调查
92%的实验组学生认为“多维度评分更公平”,87%表示“注释要求帮助理清思路”,但15%反映“代码质量规则初期难以适应”。教师反馈显示,实验组作业批改效率提升40%,且能更精准定位学生薄弱环节。
7. 结论
基于多种判分模式的Python编程考试是对传统单一结果判分模式的有效改进,它能够更全面、准确地评估学生的编程能力,涵盖了结果实现、编程过程和代码质量等多个重要方面。这种判分模式有助于培养学生良好的编程习惯和思维能力,为学生的编程能力提升提供更全面的帮助。利用AI大模型辅助判分机制,过程判分和代码质量判分存在教师手工判分效率低下和标准不统一的问题也可妥善解决。
但在AI辅助判分中,尽管通过规则量化降低了主观因素,过程判分中“关键注释”的界定仍存在教师与AI的评判逻辑差异,代码质量维度中“语义清晰”等指标的量化仍依赖人工经验。实验样本局限于单一课程的基础班学生(n = 82),未涵盖高级编程范式,如并发编程等。后续的技术落地与标准化推广仍需跨学科协作与长期实践验证。
基金项目
嘉兴南湖学院校级教育教学改革研究项目,项目名称:人工智能背景下《Python语言程序设计》课程体系优化改革和研究,项目编号:258518070。