15

如果一个函数接受 n 个参数,并且有另一个函数返回一个包含 n 个项目的序列(或者我有一个包含 n 个项目的序列),有没有办法“映射”这两个函数(或制作第一个函数将n个项目的序列作为输入并返回结果)我不想(在某些情况下可能不能)自己编辑函数并更改其参数参数和返回值类型。

IE)

def func1(x, y, z):
    return x+y+z

def func2(w):
    return [i for i in range(w,w+3)]

func1(func2( ... ))在这种情况下不能。

4

2 回答 2

18

您正在寻找*args参数语法:

>>> def foo(bar, baz, spam):
...     print bar, baz, spam
...
>>> arguments = [1, 2, 3]
>>> foo(*arguments)
1, 2, 3

将参数传递给可调用对象时,任何以星号开头的表达式*都被解释为一系列位置参数,并扩展为作为单独参数传递给被调用对象(函数、方法等)。

对于您的示例,这将是:

func1(*func2(...))

有一个使用**双星号的等效关键字(采用映射),您也可以在函数签名中使用相同的语法。

请参阅有关调用表达式的文档,对于函数签名镜像语法,请参阅有关函数定义的文档

于 2012-10-08T17:00:15.333 回答
12

它被称为参数解包,写成:

func1(*func2(...))

参考:https ://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists

于 2012-10-08T17:00:56.070 回答