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

3 投票
4 回答
18131 浏览
提问于 2025-04-29 19:50

我正在尝试创建一个函数,可以计算一组数字的平均值,或者直接计算几个整数的平均值。目前我有了:

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' object is not iterable”的错误。 我查看了其他问题,但没有一个解决方案能解决我的问题。我尝试用type()和isinstance()来检查它是否是一个列表,但每当我让其中一个方法有效时,另一个就会报错。

相关文章:

  • 暂无相关问题
暂无标签

4 个回答

0

你代码中的这个部分 if type(args) is list: 是永远不会被执行的。因为每当你通过 *args 传递非关键字参数时,接收到的 args 总是一个元组(tuple)。所以 type(args) is list 这个判断永远会返回 False。你需要做的是遍历通过 *args 传递的参数,检查每个参数的类型。如果参数是列表,那就说明你传递了一个列表,比如 average([1,3,5,7]);如果传递的是整数,那就会是整数,比如 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))

这样你就可以对这两种输入类型都得到输出了 :-

>>> average([1,3,5,7])
4.0
>>> average(1,3,5,7)
4.0
1

第二个 print sum(x) / float(len(x)) 这段代码在对 x 使用 len() 函数,而 x 是一个整数。

我想你想表达的意思是:

  else:
        print sum(args) / float(len(args))
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])
6

这里的args是一个元组,所以要检查一下args[0]是不是一个列表。如果是列表,就把args[0]里面的内容加起来。如果只是传入整数,那就直接把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

撰写回答