3

我是 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

只是喜欢min还是max功能?

4

2 回答 2

6

您可以使用以下*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
于 2012-09-23T09:39:45.457 回答
1

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

于 2012-09-23T09:42:10.633 回答