【问题标题】:Average of a vector of numbers or a list of numbers in PythonPython中数字向量或数字列表的平均值
【发布时间】:2012-09-23 09:36:41
【问题描述】:

我是 Python 新手,所以请耐心等待我的幼稚问题。

我想编写一个函数,它接受一个数字向量并计算它们的平均值。所以我写了一个小函数为

def my_mean(*args):
    if len(args) == 0:
        return None
    else:
        total = sum(args)
        ave = 1.0 * total / len(args)
        return ave

my_mean(1, 2, 3)
2.0

但如果参数是数字列表,此函数将不起作用。例如,

my_mean([1, 2, 3])
Traceback (most recent call last):
  File "/usr/lib/wingide-101-4.1/src/debug/tserver/_sandbox.py", line 1, in <module>
    # Used internally for debug sandbox under external interpreter
  File "/usr/lib/wingide-101-4.1/src/debug/tserver/_sandbox.py", line 21, in my_mean
TypeError: unsupported operand type(s) for +: 'int' and 'list'

我知道NumPy 有一个函数numpy.mean,它接受一个列表作为参数,但不像my_mean 那样接受一个数字向量。

我想知道是否有办法让my_mean 在这两种情况下都工作?所以:

my_mean(1, 2, 3)
2.0
my_mean([1, 2, 3])
2.0

就像minmax 函数一样?

【问题讨论】:

    标签: python function average


    【解决方案1】:

    您可以使用*arg 语法传入您的列表:

    my_mean(*[1, 2, 3])
    

    或者,您可以检测传入的第一个参数是否是一个序列并使用它而不是整个 args 元组:

    import collections
    
    def my_mean(*args):
        if not args:
            return None
        if len(args) == 1 and isinstance(args[0], collections.Container):
            args = args[0]
        total = sum(args)
        ave = 1.0 * total / len(args)
        return ave
    

    【讨论】:

    • 啊,很好,没想到集合 abcs。我会检查 exactly 一个论点。否则my_mean([1, 2, 3], 4) 的行为会出乎意料(实际上我希望它会出错)
    • @JonasWielicki:确实;也更新了空参数测试以更简单。
    • 感谢您的快速回复。我知道如果我使用my_mean(1, 2, 3),Python 会收集所有参数并将它们作为列表传递给args,因此在函数args 中是[1, 2, 3] 的列表。我不明白my_mean(*[1, 2, 3]) 的用法。为什么要在那里添加*?你能再解释一下吗?我在我的书中找不到它(一本非常介绍性的书)。
    【解决方案2】:

    为什么不以元组的形式传递你的列表呢? 使用func(*[1, 2, 3])

    【讨论】:

      猜你喜欢
      • 2021-12-12
      • 2014-08-20
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多