创建一个以列表或整数作为参数的函数(Python)

时间:2014-10-26 23:10:21

标签: python list function python-2.7

我试图创建一个函数,该函数将数字列表或整数的平均值作为变量。到目前为止,我有:

def average(*args):
    if type(args) is list:
        for x in args:
            print sum(x) / float(len(x))
    else:
        for x in args:
            args = list(args)
            print sum(x) / float(len(x))

当我输入一个列表时,比如

average([1, 3, 5, 2])

效果很好。但是当我进入

average(1, 3, 5, 2)

它给出" TypeError:' int'对象不可迭代"。 我已经检查了其他问题,但没有一个解决方案似乎有用。我试图检查它是否是带有type()和isinstance()的列表,但每当我让其中一个工作时,另一个就会抛出错误。

4 个答案:

答案 0 :(得分:3)

args是一个元组,所以检查args[0]是否是args[0]内容的总和列表,如果只是在sum args中传递整数:

def average(*args):
    if isinstance(args[0],list):
        print(sum(args[0]) / float(len(args[0])))
    else:
        print (sum(args) / float(len(args)))


In [2]: average(1, 3, 5, 2)
2.75

In [3]: average([1, 3, 5, 2])
2.75

如果您想接受元组,请使用collections.Iterable

from collections import Iterable
def average(*args):
    if isinstance(args[0],Iterable):
        print(sum(args[0]) / float(len(args[0])))
    else:
        print (sum(args) / float(len(args)))

In [5]: average([1, 3, 5, 2])
2.75

In [6]: average(1, 3, 5, 2)
2.75

In [7]: average((1, 3, 5, 2))
2.75

答案 1 :(得分:1)

x上的第二个print sum(x) / float(len(x))调用len(),这是一个整数。

我认为你的意思是:

  else:
        print sum(args) / float(len(args))

答案 2 :(得分:1)

repl.it

上的演示
def average(*args):
    if type(args) is tuple:
        r = 0
        for x in args:
            for y in x:
                r += y
        print r / float(len(x))
    else:
        print sum(args) / float(len(args))

average([2, 3, 8, 1, 9])

答案 3 :(得分:0)

代码中的if部分即if type(args) is list:永远不会被执行。因为,每当使用*args将非关键字参数传递给函数时,作为args接收的值始终是元组。因此type(args) is list始终为False。需要做的是迭代通过*args传递的参数并检查参数的类型,如果它是列表,那么你已经传递了一个列表i.e. average([1,3,5,7])否则当传递整数时它将是整数{{ 1}}。所以下面的代码将起作用: -

i.e. average(1,3,5,7)

这里将为您提供两种输入类型的输出: -

def average(*args):
    for x in args:
        if type(x) == list:
            # List is passed
            return sum(x) / float(len(x))
    # Assuming inputs passed restricted to list and numbers
    # Numbers are passed as argument
    return sum(args) / float(len(args))