You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:24:04