一、
在一家电商平台上,我们有一个商品评论系统。用户可以对购买的商品进行评论,每个评论都有评分(1-5分)。系统统计每个商品的评论平均分,并显示在商品详情页上。是一个简化的代码片段,用于计算商品的平均评分。代码中存在一个BUG,可能导致计算结果不准确。请找出这个BUG,并解释原因。
python
def calculate_average_score(comments):
total_score = 0
for comment in comments:
total_score += comment.get('score', 0)
average_score = total_score / len(comments)
return average_score
# 测试数据
comments = [
{'score': 1},
{'score': 2},
{'score': 3},
{'score': 4},
{'score': 5},
{'score': None} # 注意这里的评分是None
]
average_score = calculate_average_score(comments)
print("Average Score:", average_score)
二、BUG分析
在上述代码中,我们定义了一个函数`calculate_average_score`,它接收一个评论列表作为参数。每个评论都是一个字典,包含一个`score`键,其值为评论的分数。评分不存在,则默认为0。函数计算所有评论的分数总和,并除以评论的数量来得到平均分。
在这个测试数据中,我们故意将一个评论的`score`设置为`None`,以模拟一个可能出现的错误输入。下面我们来分析这个BUG:
1. 当我们遍历`comments`列表并尝试访问每个评论的`score`时,某个评论的`score`为`None`,`total_score`将不会累加这个评论的分数,因为`total_score += comment.get('score', 0)`将`None`替换为了0。
2. 这个在于,即使评分是`None`,也应该将其视为0来计算平均分,而不是完全忽略这个评论。
三、BUG修正
为了修正这个BUG,我们需要确保即使评分是`None`,它也会被计算为0。是修正后的代码:
python
def calculate_average_score(comments):
total_score = 0
count = 0
for comment in comments:
score = comment.get('score', 0)
total_score += score
count += 1
average_score = total_score / count if count != 0 else 0
return average_score
# 测试数据
comments = [
{'score': 1},
{'score': 2},
{'score': 3},
{'score': 4},
{'score': 5},
{'score': None} # 注意这里的评分是None
]
average_score = calculate_average_score(comments)
print("Average Score:", average_score)
在这个修正版本中,我们添加了一个计数器`count`来跟踪有效评分的数量。这样,即使某些评论的`score`是`None`,我们也会将其视为0,只计算实际存在的评分。
四、
通过这个面试题,我们学习了如何识别和修复代码中的BUG,特别是在处理可能的不完整或错误输入时。这个BUG的修复提醒我们在编写代码时要考虑到所有可能的边界情况,并确保代码的鲁棒性。这也展示了我们在面试中如何通过逻辑分析和代码修改来解决。
还没有评论呢,快来抢沙发~