遍历变量参数的元素

时间:2018-10-19 23:37:45

标签: python python-3.x function arguments argument-unpacking

我有一个函数scalar_func(*args),它使用可变数量的标量数字。它对它们进行一些数学运算并输出标量。举一个简单的例子,我们假设scalar_func乘以每个数字:

def scalar_func(*args):
    out = 1    
    for arg in args:
        out *= arg
    return out

我想让scalar_func处理列表。为此,我做了另一个函数list_func(*args)。它接受可变数量的列表,并像这样创建一个新列表:

def list_func(*args):
    out = []
    for i in range(len(arg[0])):
         out.append(scalar_func(arg[0][i], arg[1][i], arg[2][i]...)
    return out

显然,此功能只是伪代码。如何实现list_func

1 个答案:

答案 0 :(得分:1)

您可以在此处使用zip

def scalar_func(*values):
    return sum(values)

def list_func(*args):
    out = []
    L = list(zip(*args))
    for i in range(len(args[0])):
         out.append(scalar_func(*L[i]))
    return out

list_func([0, 1, 2], [3, 4, 5])  # [3, 5, 7]

如果列表很大,则可能希望创建一个迭代器并使用next来减少内存消耗:

def list_func(*args):
    out = []
    L = iter(zip(*args))
    for i in range(len(args[0])):
         out.append(scalar_func(*next(L)))
    return out

也可以将其重写以提高效率:

def list_func(*args):
    return [scalar_func(*i) for i in zip(*args)]

或者,您可以itertools.starmap来获得等效功能:

from itertools import starmap

def list_func(*args):
    return list(starmap(scalar_func, zip(*args)))