python中具有多个参数的函数

时间:2018-01-08 13:20:25

标签: python

我有一个将数组作为输入的函数。如何修改它以使用变量参数和数组。例如,我希望arrSum(1,2,3) == arrSum([1,2,3])返回True,即两者都应返回6

我已经问过this same question for JavaScript但是当我尝试在Python中实现相同的技术时,我会遇到完全意外的错误。

这是我根据目前对python的了解而尝试做的事情。

def arrSum(*args):
    listOfArgs = []
    listOfArgs.extend([*list(args)])
    return sum(listOfArgs)

它适用于arrSum(1,2,3),但会为arrSum([1,2,3])返回错误 arrSum(1,2,3)返回6,这是预期的输出。 但是`arrSum([1,2,3])会返回以下错误:

Traceback (most recent call last):
  File "python", line 7, in <module>
  File "python", line 4, in arrSum
TypeError: unsupported operand type(s) for +: 'int' and 'list'

print(listOfArgs)return sum(listOfArgs)之前执行[[1,2,3]]

函数的

REPL.it链接

3 个答案:

答案 0 :(得分:2)

Javascript spread运算符处理一个值数组和一个包含另一个值完全相同的数组的数组:

[].concat(...[1, 2])
Array [ 1, 2 ]
[].concat(...[[1, 2]])
Array [ 1, 2 ]

它基本上使多个数组变平:

[].concat(...[[1, 2], [3, 4]])
Array [ 1, 2, 3, 4 ]

but only by one layer:

[].concat(...[[[1, 2]]])
[[ 1, 2 ]]

Python更精确。没有隐式展平,您必须显式

def arrSum(*args):
    if len(args) == 1 and isinstance(args[0], list):
        args = args[0]
    return sum(args)

如果您想要复制多个列表的支持(arrSum([1, 2], [3, 4]),我会重复使用Flatten (an irregular) list of lists最高答案:

import collections

def flatten(l):
    for el in l:
        if isinstance(el, collections.Iterable) and not isinstance(el, (str, bytes)):
            yield from flatten(el)
        else:
            yield el

def arrSum(*args):
    return sum(flatten(args))

答案 1 :(得分:0)

您需要检查是否有列表或int。 :)

此处,此函数假定您只接收整数和整数列表。

def arrSum(*args):
    ret = 0
    total = 0
    for elem in args:
        #   If you have a list, adds the sum of the list, else, simply add the int.
        if isinstance(elem, list):
            total += len(elem)
            ret += sum(elem)
        else
            total += 1
            ret += elem

    average = ret / total
    return ret, average

print arrSum([1, 2, 3])
print arrSum(1, 2, 3)
# both outputs : 6

答案 2 :(得分:0)

从Martijin的回答中获取灵感后,我想出了一个自己的解决方案(甚至想出了一个python的扩展函数): -

{'key1': {'subkey1': 2, 'subkey2': 7, 'subkey3': 5}}

Working REPL.it link