将列表元素扩展为函数(如 matlab)的单独实际参数的 Pythonic 方式?

F. *_*one 3 python matlab function parameter-passing

假设我有一个函数f,它有一些必需和可选的形式参数(因此可以在不同点使用不同数量的参数进行调用)。假设对fI have a list, 的特定调用L,其中按顺序包含我想要传递给 的参数f。有没有什么方法可以调用fusing L,以便将 的第 i 个元素L用作i传递给 的第 个实际参数f

或者更一般地说,将列表 L 扩展到传递的下一个参数。

用matlab术语来说L就是一个元胞数组,所以如果我有一个matlab函数f

function val=f(a1,a2,a3, a4)
    % test to see if a4, opt arg, was passed
    % if not, default it to 0;
    if(~exist('a4','var')) 
       a4=0;
    end
    val = a1+a2+a3+a4;
end
Run Code Online (Sandbox Code Playgroud)

和一个 matlab 元胞数组C(概念上对应于上面的 python 列表L

C = {1,2,3};
Run Code Online (Sandbox Code Playgroud)

我可以f这样调用:

result=f(C{:}) % so result= 6
Run Code Online (Sandbox Code Playgroud)

soC{i}作为第 th 个参数传递i

f对输入元胞数组的另一次调用可能有 4 个项目,并使用相同的语法来调用f

或这个

result = f(1,C{i,J})
Run Code Online (Sandbox Code Playgroud)

i所以传递的第一个参数是 1,其余的是元胞数组元素j

Fri*_*les 5

在函数调用中的列表名称前面放置一个 *(请在此处查看更多信息http://docs.python.org/tutorial/controlflow.html#unpacking-argument-lists)。

所以,如果你的清单是 L,你会这样做

result = f(*L)
Run Code Online (Sandbox Code Playgroud)

如果您只想使用 L 的某些元素,例如从 i 到 j(不包括 j,因为切片在右侧是排他的),那么首先对列表进行切片,然后执行与上面相同的操作:

result = f(*L[i:j])
Run Code Online (Sandbox Code Playgroud)

对于输入参数并使用其他列表元素作为其他参数的最后一个示例,它是类似的,请参见下文:

lst = [1, 2, 3, 4]
def f(a, b, c, d):
    return b
print(f(1, *lst[1: 4]))
#this would print 2
Run Code Online (Sandbox Code Playgroud)