Python 实现一个名为Average的类作为List的子类

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

其思想是创建一个类,该类可以检查列表中的所有项是否都是整数,如果是,则将这些项的总和计算为平均值。如果列表中的所有项都不是整数,则会引发ValueError异常

这就是我目前拥有的:

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()