将元组扩展为参数


411

有没有一种方法可以将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")

我知道可以将其定义myfunmyfun((a, b, c)),但是当然可能会有遗留代码。谢谢

Answers:


733

myfun(*some_tuple)完全符合您的要求。的*操作者只需解包元组(或任何可迭代),并把它们作为位置函数的自变量。阅读有关解压缩参数的更多信息。


8
*运算符只是解压缩元组并将它们作为位置参数传递给函数。在此处查看更多信息:docs.python.org/3/tutorial/…–
john_mc

4
注意,相同的语法可以用于列表和元组。
brendon-ai

我发现您可以对列表(实际上,任何可迭代的字符串,包括字符串)执行相同操作,不确定列表的可变性如何影响事物。这将很有趣。
wcyn

52

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

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

13
似乎只有扩展的元组在通常提供的参数之后才能执行此操作-当我执行此操作时,解释器不喜欢它:some_func(*tuple_of_stuff, another_argument)
Tom Galvin 2015年

6
@Quackmatic在Python 3.5.1
River

1
@Quackmatic借用@River,在Python 3.5.4中工作正常:def func(a,b,c,d): print(a,b,c,d)args = ('fee', 'fi', 'fo'); func(*args, 'fum')
R. Navega

15

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

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


8

这是功能编程方法。它从语法糖中提升了元组扩展功能:

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

用法示例:

from toolz import * 
from operator import add, eq

apply_tuple = curry(apply_tuple)

thread_last(
    [(1,2), (3,4)],
    (map, apply_tuple(add)),
    list,
    (eq, [3, 7])
)
# Prints 'True'

咖喱的redefiniton apply_tuple节省了大量的partial,从长远来看通话。


5
这对初学者没有帮助。它使用第三方模块,并做其他令人困惑的事情……
gberger

gberger,lambda f, t: f(*t)不使用第三方模块,我是Python初学者,这对我很有帮助。这是一种纯功能方法。如果您不使用此样式,则此答案不适合您。
Dominykas Mostauskis

1
我所说的是toolz是第三方的
gberger

5
并非每个答案都一定是针对初学者的
乔丹(Jordan)

1
对于您给出的示例,可以使用starmap docs.python.org/3.7/library/itertools.html#itertools.starmap
Bo。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.