将元组展开为参数

是否有一种方法将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")
我知道可以将myfun定义为myfun((a, b, c)),但当然可能存在遗留代码。 由于< / p >
311125 次浏览

myfun(*some_tuple)完全是你所要求的。*操作符只是将元组(或任何可迭代对象)解包,并将它们作为位置参数传递给函数。阅读更多关于拆包参数

看看Python教程的4.7.3节和4.7.4节。 它讨论了将元组作为参数传递

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

注意,你也可以展开部分参数列表:

myfun(1, *("foo", "bar"))

这就是函数式编程方法。它将元组展开特性从语法糖中移除:

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

通过curry重新定义apply_tuple,从长远来看可以节省大量的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'

类似于@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))
[2]是一个元组 ('白人','失业','收入')

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

all_data[list(np.asarray(features[2]))]