将元组扩展为参数
- 2024-11-28 08:37:00
- admin 原创
- 130
问题描述:
假设我有一个如下函数:
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
。
另请参阅:在函数调用中 *(双星号/星号)和 (星号/星号)是什么意思? - 对于遇到该语法并对其感到困惑的人提出的相应问题。
解决方案 1:
myfun(*some_tuple)
完全按照您的要求执行。*
运算符只是解包元组(或任何可迭代对象)并将它们作为位置参数传递给函数。阅读有关解包参数的更多信息。
解决方案 2:
请注意,您还可以扩展部分参数列表:
myfun(1, *("foo", "bar"))
解决方案 3:
请查看Python 教程第 4.7.3 和 4.7.4 节。其中讨论了如何将元组作为参数传递。
我还会考虑使用命名参数(并传递字典),而不是使用元组并传递序列。我发现当位置不直观或有多个参数时,使用位置参数是一种不好的做法。
解决方案 4:
这是函数式编程方法。它从语法糖中提取了元组扩展功能:
apply_tuple = lambda f, t: f(*t)
重新定义apply_tuple
via可以从长远来看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'
解决方案 5:
与@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))
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD