Python函数参数与变量传递存疑,求修正评分星号展示代码
Python参数传递与评分星号功能修正
原代码的核心问题
- 变量作用域错误:
determine_stars函数直接使用avg变量,但avg是main函数的局部变量,函数间无法直接访问彼此的局部变量,必须通过参数传递。 - 平均分计算逻辑错误:每次循环都覆盖
score变量,最后仅用最后一个分数除以5,正确做法是累加所有5个分数后再求平均。 - 条件判断逻辑错误:所有
if/elif用了or,应替换为and,否则会出现逻辑混乱(比如任何≤10的数都会匹配第一个条件)。 - 输入验证不完整:仅第一个输入做了范围检查,后续4个输入未验证是否在0-10之间。
修正后的代码
def main(): total_score = 0.0 # 获取5个有效评分 for _ in range(5): while True: try: score = float(input("Enter a score between 0 and 10: ")) if 0 <= score <= 10: total_score += score break else: print("ERROR! Enter a score between 0 and 10: ") except ValueError: print("ERROR! Please enter a valid number.") avg = total_score / 5 # 将平均分作为实参传给determine_stars函数的参数 stars = determine_stars(avg) print(f'Your average score of {avg:.1f} gives you {stars}') def determine_stars(avg): # 定义参数avg接收传入的实参 if 9.0 <= avg <= 10.0: return "*****" elif 8.0 <= avg <= 8.9: return "****" elif 7.0 <= avg <= 7.9: return "***" elif 6.0 <= avg <= 6.9: return "**" elif 5.0 <= avg <= 5.9: return "*" else: return "No Stars" main()
关键修改说明
- 参数传递实现:给
determine_stars定义参数avg,在main调用时将计算好的平均分作为实参传入,解决变量作用域问题,这就是函数参数传递的核心语法。 - 分数累加逻辑:用
total_score累加所有有效分数,最后除以5得到正确平均分。 - 完善输入验证:每个输入都通过循环校验,同时处理非数字输入的异常,确保所有输入都是0-10之间的有效数字。
- 修复条件判断:把
or替换为and,并用Python链式比较写法简化逻辑,更清晰直观。 - 函数返回值优化:直接返回星号字符串,简化代码结构。
内容的提问来源于stack exchange,提问作者r00
相关产品推荐
相关产品推荐

