提问人:AkiRoss 提问时间:1/3/2010 最后编辑:Karl KnechtelAkiRoss 更新时间:10/6/2023 访问量:339659
将元组扩展为参数
Expanding tuples into arguments
问:
假设我有一个这样的函数:
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
Смотритетакже: **(双星号/星号)和 *(星号/星号)在函数调用中是什么意思? - 对于遇到语法并对此感到困惑的人的相应问题。
答:
974赞
Alex Martelli
1/3/2010
#1
myfun(*some_tuple)
完全按照您的要求做。运算符只需解压缩元组(或任何可迭代对象),并将它们作为位置参数传递给函数。阅读有关解压缩参数的更多信息。*
评论
16赞
john_mc
7/1/2017
* 运算符只是解压缩元组并将它们作为位置参数传递给函数。在这里查看更多: docs.python.org/3/tutorial/...
4赞
brendon-ai
8/17/2017
请注意,相同的语法可用于列表和元组。
0赞
wcyn
11/26/2017
我发现你可以对列表(事实上,任何可迭代对象,包括字符串)做同样的事情,不确定它们的可变性如何影响事物。这将是有趣的研究。
16赞
Uri
1/3/2010
#2
查看 Python 教程第 4.7.3 节和 4.7.4。 它谈到将元组作为参数传递。
我还会考虑使用命名参数(并传递字典)而不是使用元组并传递序列。我发现当位置不直观或有多个参数时,使用位置参数是一种不好的做法。
76赞
Valentas
3/19/2015
#3
请注意,您还可以展开参数列表的一部分:
myfun(1, *("foo", "bar"))
评论
17赞
Tom Galvin
4/20/2015
似乎只有当扩展元组在通常提供的参数之后时,您才能这样做 - 当我这样做时,解释器不喜欢它:some_func(*tuple_of_stuff, another_argument)
7赞
River
6/13/2016
@Quackmatic 在 Python 3.5.1 中,将扩展元组放在任何位置似乎都工作正常
1赞
R. Navega
9/6/2018
@Quackmatic附议@River,这在 Python 3.5.4 中工作正常:def func(a,b,c,d): print(a,b,c,d)
args = ('fee', 'fi', 'fo'); func(*args, 'fum')
9赞
Dominykas Mostauskis
1/8/2017
#4
这就是函数式编程方法。它将元组扩展功能从语法糖中解脱出来:
apply_tuple = lambda f, t: f(*t)
从长远来看,通过咖喱
重新定义可以节省大量调用: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'
评论
12赞
gberger
5/26/2017
这对初学者没有帮助。它使用第三方模块并做其他令人困惑的事情......
2赞
gberger
5/30/2017
toolz 是第三方,这就是我的意思
8赞
Jordan
9/2/2017
并非每个答案都必须适合初学者
2赞
Nicolas Gervais
5/27/2020
这是一个可怕的答案
6赞
Mateen Ulhaq
11/20/2020
#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))
评论
0赞
MissSergeivna
3/24/2021
您也可以定义 : def add(some_tyuple: tuple),然后使用索引进行访问
评论