499

有没有办法将 Python 元组扩展为函数 - 作为实际参数?

例如,这里expand()有魔法:

some_tuple = (1, "foo", "bar")

def myfun(number, str1, str2):
    return (number * 2, str1 + str2, str2 + str1)

myfun(expand(some_tuple)) # (2, "foobar", "barfoo")

我知道可以定义myfunmyfun((a, b, c)),但当然可能有遗留代码。谢谢

4

6 回答 6

873

myfun(*some_tuple)完全符合您的要求。运算符只需解*包元组(或任何可迭代的)并将它们作为位置参数传递给函数。阅读有关解包参数的更多信息。

于 2010-01-03T02:24:05.673 回答
61

请注意,您还可以展开部分参数列表:

myfun(1, *("foo", "bar"))
于 2015-03-19T06:31:30.810 回答
16

查看Python 教程4.7.3 和 4.7.4 部分。它谈论将元组作为参数传递。

我还会考虑使用命名参数(并传递字典)而不是使用元组并传递序列。当位置不直观或有多个参数时,我发现使用位置参数是一种不好的做法。

于 2010-01-03T02:28:28.287 回答
9

这是函数式编程方法。它将元组扩展功能从语法糖中提取出来:

apply_tuple = lambda f, t: f(*t)

从长远来看,重新定义apply_tupleviacurry以节省大量调用:partial

from toolz import curry
apply_tuple = curry(apply_tuple)

示例用法:

from operator import add, eq
from toolz import thread_last

thread_last(
    [(1,2), (3,4)],
    (map, apply_tuple(add)),
    list,
    (eq, [3, 7])
)
# Prints 'True'
于 2017-01-07T21:55:43.123 回答
3

与@Dominykas 的回答类似,这是一个将多参数接受函数转换为元组接受函数的装饰器:

apply_tuple = lambda f: lambda args: f(*args)

示例 1:

def add(a, b):
    return a + b

three = apply_tuple(add)((1, 2))

示例 2:

@apply_tuple
def add(a, b):
    return a + b

three = add((1, 2))
于 2020-11-20T00:53:12.137 回答
0

features[2] 是一个元组 ('White', 'Unemployment', 'Income')

现在使用 features[2] 作为列的参数列表

all_data[list(np.asarray(features[2]))]
于 2021-08-15T14:07:18.653 回答