将元组扩展为参数

Expanding tuples into arguments

提问人:AkiRoss 提问时间:1/3/2010 最后编辑:Karl KnechtelAkiRoss 更新时间:10/6/2023 访问量:339659

问:

假设我有一个这样的函数:

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

给定一个元组,我将如何使用调用?这应该输出结果。some_tuple = (1, "foo", "bar")some_tuplemyfun(2, "foobar", "barfoo")

我知道可以定义以便它直接接受元组,但我想调用现有的.myfunmyfun


Смотритетакже: **(双星号/星号)和 *(星号/星号)在函数调用中是什么意思? - 对于遇到语法并对此感到困惑的人的相应问题。

python 元组 参数传递

评论


答:

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_tuplepartial

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
并非每个答案都必须适合初学者
1赞 Bo. 9/4/2019
对于您给出的示例,可以使用 docs.python.org/3.7/library/itertools.html#itertools.starmapstarmap
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),然后使用索引进行访问