Python 实现一个名为Average的类作为List的子类
其思想是创建一个类,该类可以检查列表中的所有项是否都是整数,如果是,则将这些项的总和计算为平均值。如果列表中的所有项都不是整数,则会引发ValueError异常 这就是我目前拥有的:Python 实现一个名为Average的类作为List的子类,python,list,class,average,Python,List,Class,Average,其思想是创建一个类,该类可以检查列表中的所有项是否都是整数,如果是,则将这些项的总和计算为平均值。如果列表中的所有项都不是整数,则会引发ValueError异常 这就是我目前拥有的: class AvgList(list): def avg(self): self.list = [] for items in self: if not isinstance(items,int): try: pass
class AvgList(list):
def avg(self):
self.list = []
for items in self:
if not isinstance(items,int):
try:
pass
except ValueError:
print('Invalid item in list. All items need to be an integer.')
for x in []:
return sum(x)/len(list)
def append(self, item):
newList = list.append(self,item)
return newList
def __len__(self):
return len(self.list)
mylist = AvgList()
mylist.append(1)
mylist.append(5)
mylist.append(10)
print(mylist)
print(mylist.avg())
当前,当我运行它时,它返回:
[1, 5, 10]
None
但是,我不知道如何让它返回平均值。我做错了什么
for x in []:
return sum(x) / len(list)
这是行不通的,您没有要遍历的元素,这就是为什么会得到None
,因为python函数在没有显式返回的情况下返回None
这是行不通的,您没有要遍历的元素,这就是为什么会得到None
,因为python函数在没有显式返回时返回None
class AvgList(list):
def avg(self):
for items in self:
if not isinstance(items,int):
raise ValueError('Invalid item in list. All items need to be an integer.')
return sum(self)/len(self)
您不需要重写append和len方法,因为您在这些方法中没有做任何特殊的操作。试试这个
class AvgList(list):
def avg(self):
for items in self:
if not isinstance(items,int):
raise ValueError('Invalid item in list. All items need to be an integer.')
return sum(self)/len(self)
您不需要重写append和len方法,因为您在这些方法中没有做任何特殊的事情。您有很多不必要的垃圾。如果您对
列表
的实现感到满意,则无需定义自己的附加
或\uuuuuuuuuu\uuuu
class AvgList(list):
def avg(self):
tot = 0
for item in self:
if isinstance(item, int):
tot += item
else:
print('Invalid item in list. All items need to be an integer.')
return tot / len(self)
你那里有很多不必要的垃圾。如果您对
列表
的实现感到满意,则无需定义自己的附加
或\uuuuuuuuuu\uuuu
class AvgList(list):
def avg(self):
tot = 0
for item in self:
if isinstance(item, int):
tot += item
else:
print('Invalid item in list. All items need to be an integer.')
return tot / len(self)
您正在尝试的代码有错误。。
self.list=[]
是不需要的(您无论如何都不会使用它)
这:
也是错误的,因为您所做的是在[]中对x迭代一个空列表,然后尝试返回一个整数的和sum(x)
,该整数可能是一个整数除以一个类的len(列表是一个内置类)。。所以,即使你迭代的是一个实列表而不是一个空列表,你也不能求和(x),因为sum用于列表而不是整数,你不能除以len(list)
,因为list是一个类类型,len
不能解析这个东西。。。在python中执行所需操作的最简单方法如下:
class AvgList(list):
def avg(self):
if not all(map(lambda x:isinstance(x, int), self)):
raise ValueError('Invalid item in list. All items need to be an integer.')
try:
return sum(self) / len(self)
except ZeroDivisionError:
print('Empty list')
# here you can either not return nothing
# which means None will be returned, or return something else
return -1
无需执行任何其他操作。您正在尝试的代码有错误。。
self.list=[]
是不需要的(您无论如何都不会使用它)
这:
也是错误的,因为您所做的是在[]
中对x迭代一个空列表,然后尝试返回一个整数的和sum(x)
,该整数可能是一个整数除以一个类的len(列表是一个内置类)。。所以,即使你迭代的是一个实列表而不是一个空列表,你也不能求和(x),因为sum用于列表而不是整数,你不能除以len(list)
,因为list是一个类类型,len
不能解析这个东西。。。在python中执行所需操作的最简单方法如下:
class AvgList(list):
def avg(self):
if not all(map(lambda x:isinstance(x, int), self)):
raise ValueError('Invalid item in list. All items need to be an integer.')
try:
return sum(self) / len(self)
except ZeroDivisionError:
print('Empty list')
# here you can either not return nothing
# which means None will be returned, or return something else
return -1
不需要做任何其他事情。我会让它成为一个非成员函数。然后它可以处理任何序列,而且也简单得多:
>>> def average(sequence):
... if all(isinstance(item, int) for item in sequence):
... return float(sum(sequence)) / len(sequence)
... else:
... raise ValueError('Invalid item in sequence. All items need to be an integer.')
>>> average([1, 2, 3, 4])
2.5
>>> average({1, 3, 3, 3, 3, 3})
2.0
>>> average('12345')
Traceback (most recent call last):
ValueError: Invalid item in sequence. All items need to be an integer.
但是,这不适用于生成器:
>>> average(item for item in [1, 2, 3])
Traceback (most recent call last):
TypeError: object of type 'generator' has no len()
我会让它成为一个非成员函数。然后它可以处理任何序列,而且也简单得多:
>>> def average(sequence):
... if all(isinstance(item, int) for item in sequence):
... return float(sum(sequence)) / len(sequence)
... else:
... raise ValueError('Invalid item in sequence. All items need to be an integer.')
>>> average([1, 2, 3, 4])
2.5
>>> average({1, 3, 3, 3, 3, 3})
2.0
>>> average('12345')
Traceback (most recent call last):
ValueError: Invalid item in sequence. All items need to be an integer.
但是,这不适用于生成器:
>>> average(item for item in [1, 2, 3])
Traceback (most recent call last):
TypeError: object of type 'generator' has no len()
为什么要在[]
中为x编写?该循环将运行零次。try:pass
?except
将永远不会发生。您的try/except
块没有做任何事情。您已经在检查是否为整数,并且您没有尝试捕获任何异常。返回和(x).
也不会像您认为的那样。我想当它崩溃时,您会发现这一点。为什么需要子类化?为什么不使用一个计算序列平均值的函数呢?为什么要在[]
中为x编写?该循环将运行零次。try:pass
?except
将永远不会发生。您的try/except
块没有做任何事情。您已经在检查是否为整数,并且您没有尝试捕获任何异常。返回和(x).
也不会像您认为的那样。我想当它崩溃时,您会发现这一点。为什么需要子类化?为什么不使用一个计算序列平均值的函数呢?我想你应该拒绝其他数字类型-float
,complex
,fraction.fraction
等等。@paradox,太晚了(@7stud它会处理零除法错误,但如果你传递一个空列表。我认为你应该拒绝其他数字类型-float
,complex
,fraction.fraction
等等。@paradox,太晚了(@7stud它会处理零除法错误,但以防你传递一个空列表。我不知道我在做什么。你能让我知道吗?是的,这也有效,它与我的原始代码非常相似。我对类还是新手,所以我在使用self时使用了其他变量。有趣的是,事后诸葛亮总是20/20。谢谢大家,我知道联系它。这里有很多很好的答案,但我真的很喜欢这一个,因为它的简单性和我发布的内容的相似性。我没有看到我在做什么。你能告诉我吗?是的,这也有效,它与我的原始代码非常相似。我对类还是新手,所以我在应该使用self的时候使用了其他变量。hindsig很有趣ht总是20/20。非常感谢,我很感激。这里有很多很好的答案,但我真的很喜欢这一个,因为它与我发布的内容非常简单和相似。谢谢你,我很感谢你的帮助。你能解释一下让[isinstance(item,int)作为item in self的目的吗括号中?@Classical31是一个名为列表理解的python构造。它们非常快速有效。列表理解用于从其他数据创建列表。列表理解类似于putti
>>> average(item for item in [1, 2, 3])
Traceback (most recent call last):
TypeError: object of type 'generator' has no len()