Python在run()函数内调用自定义函数触发TypeError如何解决
问题修复方案
报错根因
你遇到的类型错误核心原因是:在run()函数调用average_temperature时,第二个参数直接传入了input,这是Python的内置输入函数对象,并非你需要用来过滤日期的字符串值。如果你是想要获取用户输入的过滤关键词,应该写为input("请输入过滤关键词:"),带括号才是执行函数获取返回的字符串值,直接写input传的是函数本身。代码执行到if filter in row[date_index]判断逻辑时,尝试用函数对象匹配字符串,不符合in操作符的运算要求,因此抛出报错。
其他可优化的冗余问题
csv_reader定义了入参file,但函数内部硬编码读取"Temperatures.csv",参数未生效average_temperature定义了第一个入参weather,但内部未使用,还重复调用csv_reader读取文件,run()中提前读取的文件结果完全浪费,存在冗余IO- 不要用
sum、len这类Python内置函数名作为自定义变量名,避免覆盖原有功能引发后续异常 - 没有做空数据判断,匹配不到符合条件的记录时会触发除零报错
修复后代码
import csv date_index = 0 temp_index = 2 def csv_reader(file_path): lst = [] # 用传入的参数读取文件,取消硬编码 with open(file_path, 'r') as weather_file: weather_reader = csv.reader(weather_file) # 简化表头跳过逻辑 next(weather_reader) for row in weather_reader: lst.append(row) return lst def average_temperature(weather_data, filter_str): temp_sum = 0 count = 0 for row in weather_data: if filter_str in row[date_index]: temp_sum += float(row[temp_index]) count += 1 # 新增除零保护 return temp_sum / count if count != 0 else 0 def run(): # 只读取一次文件,复用结果减少IO weather_data = csv_reader("Temperatures.csv") # 按需替换为你要过滤的日期关键词,比如筛选2024年数据就填"2024" # 如果需要用户手动输入,改为 filter_str = input("请输入要过滤的日期关键词:") filter_str = "2024" avg_temp = average_temperature(weather_data, filter_str) print(f"平均温度为:{avg_temp}") if __name__ == '__main__': run()
内容的提问来源于stack exchange,提问作者Breezy
相关产品推荐
相关产品推荐

