如何修复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
相关产品推荐
相关产品推荐

