Python编写统计计算类触发ValueError:空字符串无法转十进制整数
错误原因定位
你碰到的ValueError: invalid literal for int() with base 10: ''报错,核心原因是代码缩进错误:
statSet.addNumber(int(n))不在while循环内部,逻辑变成了:循环持续读取用户输入,只要输入是空就跳出循环,跳出循环后才会执行int转换,此时n必然是空字符串,转换自然失败。
除此之外代码还有多处其他bug,会导致后续运行报错:
- StatSet类初始化时
self.data被赋值为整数0,后续调用append方法会抛出'int' object has no attribute 'append'错误 - median方法中空数据集的返回值写错为
Non,正确应为None - 标准差计算逻辑错误,未除以数据个数,计算结果不符合标准差定义
- 程序入口判断
if __name__ == '__main__':缩进错误,写在了main函数内部 - 末尾多余的
main()调用会导致程序重复执行 - 未做输入合法性校验,用户输入非数字内容时会直接崩溃
修复方案
按以下步骤修改代码即可解决所有问题:
- 调整
statSet.addNumber(int(n))的缩进,放到while循环内部,每次输入非空值就立即添加到统计集合 - 修改
__init__方法的初始化逻辑,将self.data = 0改为self.data = [] - 修正median方法的返回值拼写错误
- 调整程序入口的缩进到全局级别,删除末尾多余的
main()调用 - 修正标准差的计算逻辑,平方和除以数据个数后再开平方
- 添加输入合法性校验,避免用户输入非数字时程序崩溃
修正后完整代码
# statistics calc from math import sqrt class StatSet: def __init__(self): # 初始化为空列表而非整数0 self.data = [] def getData(self): return self.data def addNumber(self,x): if isinstance(x,(int,float)): self.data.append(x) return self def mean(self): nums = self.data if len(nums)>0: return sum(nums)/len(nums) else: return 0 def median(self): nums = self.data nums.sort() length = len(nums) remainder = length%2 med = 0 if length == 0: # 修正拼写错误Non为None return None elif remainder ==0: med = (nums[length//2] + nums[length//2-1])/2 else: med = nums[length//2] return med def stdDev(self): data = self.data N = self.count() if N == 0: return 0 mean = self.mean() devSum = 0 for i in range(N): devSum = devSum + (data[i] - mean)**2 # 修正标准差计算,除以数据个数后开平方 return sqrt(devSum / N) def count(self): return len(self.data) def min(self): if self.count() == 0: return None nums = sorted(self.data) return nums[0] def max(self): if self.count() == 0: return None nums = sorted(self.data) return nums[-1] def main(): print("Program test of StatSet class") statSet = StatSet() while True: n = input("Enter a number (press enter to quit): ") if n == "": break # 增加输入合法性校验 try: num = int(n) statSet.addNumber(num) except ValueError: print("请输入合法数字!") print("Data: ", statSet.getData()) print("Mean: ", statSet.mean()) print("Median: ", statSet.median()) print("Standard deviation: ", statSet.stdDev()) print("Min: ", statSet.min()) print("Max: ", statSet.max()) print("Count: ", statSet.count()) # 修正入口缩进 if __name__ == '__main__': main()
内容的提问来源于stack exchange,提问作者M B
相关产品推荐
相关产品推荐

