将可变长度参数传递给python中的函数

时间:2013-11-07 19:42:03

标签: python parameter-passing

这个问题虽然具体,但可以抽象为关于Python的一般性问题。

想象一下,有一个函数可以接受一些参数。该参数列表具有可变长度;但是,给定参数的类型不可变。参数以三个为一组,第一个和第二个是浮点列表,第三个是字符串。然后它重复。因此,在某种程度上,参数是的可变长度,它被限制为3的倍数。

类型可以是任何东西,那些只是我的问题所特有的。我有一个matplotlib绘图函数,在文档中看起来像这样:

a.plot(x1, y1, 'g^', x2, y2, 'g-',...)

正如你所看到的,你想要的三组人数可以多长。

我有一个包含所有x值(x1,x2,x3,...)的列表列表以及包含所有y值(y1,y2,y3,...)的列表列表。不知道这些列表有多长(但它们的长度总是相等),并假设我可以有一些字典将某些索引映射到某些字符串(对于字符串参数),如何从变量长度传递索引此功能的列表列表。

理想情况下,我猜它看起来像是伪代码:

for element in list_of_lists:
    myFunction(lists_of_lists[element])

除了此代码只对list_of_lists中的所有元素执行myFunction。相反,我想要一个长参数列表,只执行一次函数。我也觉得这个问题对Python整体感兴趣,而不仅仅是我的具体问题。提前谢谢!

1 个答案:

答案 0 :(得分:1)

给出n个相等长度的列表(例如):

a = [x1, x2, x3]
b = [y1, y2, y3]
c = ['g^', 'g-', 'g+']

zip将从每个列表中获取一个元素,并按照传入的顺序将它们放入元组中。

从我们的示例中,zip(a, b, c)返回:

[(x1, y1, 'g^'), (x2, y2, 'g-'), (x3, y3, 'g+')]

现在将其传递给情节:

list_of_tuples = zip(a, b, c)
denormalized = [x for tup in list_of_tuples for x in tup]
plot(*denormalized)

[x for tup in list_of_tuples for x in tup]是一个列表理解,它会为for x in tup中的每个tup执行list_of_tuples,并将每个x按顺序附加到最终列表中。换句话说,它将元组列表展平为一个列表。

在我们的示例中,denormalized变为

[x1, y2, 'g^', x2, y2, 'g-', x3, y3, 'g+']

它在功能上等同于:

denormalized = []
for tup in list_of_tuples:
    for x in tup:
        denormalized.append(x)

当应用于列表时,解包运算符(*)告诉python使用列表中的每个元素调用该函数,就像它作为位置参数传入一样。