Python代码运行报TypeError,请求排查嵌套函数与CSV处理问题
问题排查与代码修正
核心错误及修复点
- 字典方法调用错误:
data.items需改为data.items(),因为items是字典的内置方法,必须通过括号调用才能生成可迭代的键值对集合,否则直接引用方法对象会触发TypeError: 'builtin_function_or_method' object is not iterable。 - 未正确接收文件读取结果:
main函数中调用read_file(filename)后,没有将返回值赋值给data,且read_file原本返回的results列表毫无用处,应该让read_file返回整理好的批次数据字典。 - 批次数据格式错误:
read_file中data[batch] += [float(four_vals[1]), float(four_vals[2]), float(four_vals[3])]会把单个样本的三个值拆成独立元素追加,导致后续遍历三元组时解包失败,需改为追加三元组元组data[batch].append( (float(four_vals[1]), float(four_vals[2]), float(four_vals[3])) )。 - 除以零风险处理:当批次中无符合条件的样本时,
n为0,需添加判断避免ZeroDivisionError。
修正后的完整代码
def read_file(filename): data = {} with open(filename, 'r') as h: for line in h: four_vals = line.strip().split(',') # 去除换行符,避免末尾空元素 batch = four_vals[0] if batch not in data: data[batch] = [] # 追加三元组,保持每个样本的结构 data[batch].append( (float(four_vals[1]), float(four_vals[2]), float(four_vals[3])) ) return data def check_statement(x,y): return x**2 + y**2 <= 1 # 简化返回逻辑 def calculate_values(sample): n = 0 x_sum = 0 for (x, y, val) in sample: if check_statement(x,y): x_sum += val n += 1 return x_sum / n if n != 0 else 0.0 # 处理n为0的情况 def main(): filename = input('Which csv file should be analyzed? ') data = read_file(filename) # 接收读取的批次数据 print("Batch \t Average") for batch, sample in data.items(): # 调用items()方法 avg = calculate_values(sample) print(batch, "\t", avg) if __name__ == "__main__": main()
补充说明
- 新增
line.strip()处理每行末尾的换行符,避免拆分后出现空字符串元素。 - 简化
check_statement函数的返回逻辑,直接返回布尔表达式结果。 - 添加
if __name__ == "__main__":确保主函数仅在直接运行脚本时执行,符合Python规范。
内容的提问来源于stack exchange,提问作者pythonhelpneeded
相关产品推荐
相关产品推荐

