将元组扩展为参数

问题描述 投票:0回答:5

假设我有一个类似的功能:

def myfun(a, b, c):
    return (a * 2, b + c, c + b)

给定一个元组

some_tuple = (1, "foo", "bar")
,我如何使用
some_tuple
来调用
myfun
?这应该输出结果
(2, "foobar", "barfoo")

我知道可以定义

myfun
以便它直接接受元组,但我想调用现有的
myfun


另请参阅:**(双星/星号)和*(星号/星号)在函数调用中意味着什么? - 对于遇到语法并对此感到困惑的人来说,相应的问题。

python tuples parameter-passing
5个回答
969
投票

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


76
投票

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

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

16
投票

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

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


10
投票

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

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

通过

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

6
投票

与@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))
© www.soinside.com 2019 - 2024. All rights reserved.