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

如何修复Python自定义类中调用方法时触发的NameError报错

错误原因

  • 缩进层级错误:getNumbers、main 函数以及末尾的 if __name__ == '__main__' 代码块被错误缩进在了StatSet类的内部,属于类的成员而非全局函数,所以main里直接调用全局作用域的getNumbers时会触发未定义报错。
  • getNumbers 方法内的return语句缩进错误,被放在了while循环内部,输入第一个数值后就会直接结束输入流程,无法接收多个数值。
  • addNumber方法内的else块缩进多了一个空格,和前面的if不对齐,运行时会触发缩进错误。

修复方案

把不属于StatSet类的三个代码块的缩进全部回退到和class StatSet同级,同时修正return的缩进位置即可,修正后完整代码如下:

from math import sqrt

class StatSet:
    def __init__(self):
        self.data = {}

    def addNumber(self, x):
        if x in self.data:
            self.data[x] += 1
        else:
            self.data[x] = 1

    def mean(self):
        total = sum(num*count for num,count in self.data.items())
        return total / self.count()

    def median(self):
        midway = (self.count() + 1) // 2
        countingUp = 0
        for num in sorted(list(self.data)):
            countingUp += self.data[num]
            if countingUp >= midway:
                return num

    def stdDev(self):
        num = sum([(num - self.mean())**2*count for num, count in
        self.data.items()])
        den = self.count() -1
        return sqrt(num/den)

    def count(self):
        return sum(self.data.values())

    def min(self):
       return min(self.data)

    def max(self):
       return max(self.data)

# 以下代码回退缩进,和类同级,属于全局作用域
def getNumbers():
    nums = StatSet()
    xStr = input("Enter a number (<Enter> to quit) >> ")
    while xStr != "":
        x = eval(xStr)
        nums.addNumber(x)
        xStr = input("Enter a number (<Enter> to quit) >> ")
    # return移出while循环
    return nums

def main():
    print("This program computes mean, median, standard "
          "deviation, minimum, and maximum. \n")

    data = getNumbers()
    xbar = data.mean()
    std = data.stdDev()
    med = data.median()
    minNum = data.min()
    maxNum = data.max()

    print("\nThe mean is", xbar)
    print("The standard deviation is", std)
    print("The median is", med)
    print("The minimum value is", minNum)
    print("The maximum value is", maxNum)

if __name__ == '__main__':
    main()

内容的提问来源于stack exchange,提问作者John Lutes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:54:05