将元组扩展为参数

Aki*_*oss 375 python tuples parameter-passing

有没有办法将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")
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lli 688

myfun(*tuple)正是你要求什么.

侧问题:不要为你的标识符内建类型的名称,如使用*,tuple,list,file,等等-这是可怕的做法,它回来,咬你的时候,你最不经意的时候,所以只是进入的积极的习惯,避免使用您自己的标识符隐藏内置名称.

  • *运算符只需解压缩元组并将它们作为函数的位置参数传递.在此处查看更多信息:https://docs.python.org/3/tutorial/controlflow.html#tut-unpacking-arguments (8认同)
  • 请注意,相同的语法可用于列表和元组。 (3认同)

Val*_*tas 46

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

myfun(1, *("foo", "bar"))
Run Code Online (Sandbox Code Playgroud)

  • 如果扩展的元组在正常提供的参数之后,你似乎只能这样做 - 解释器在我这样做时不喜欢它:`some_func(*tuple_of_stuff,another_argument)` (12认同)
  • @Quackmatic在任何位置都有扩展的元组似乎在Python 3.5.1中运行良好 (6认同)

Uri*_*Uri 14

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

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


Dom*_*kis 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'
Run Code Online (Sandbox Code Playgroud)

从长远来看,curry redefiniton apply_tuple可以节省很多partial电话.

  • 并非每个答案都必须适合初学者 (5认同)
  • 这对初学者没有帮助.它使用第三方模块,并做其他令人困惑的事情...... (3认同)
  • toolz 是第三方,这就是我的意思 (2认同)
  • 这是一个糟糕的答案 (2认同)

Mat*_*haq 6

与@Dominykas的答案类似,这是一个将多参数接受函数转换为元组接受函数的装饰器:

apply_tuple = lambda f: lambda args: f(*args)
Run Code Online (Sandbox Code Playgroud)

示例1:

def add(a, b):
    return a + b

three = apply_tuple(add)((1, 2))
Run Code Online (Sandbox Code Playgroud)

示例2:

@apply_tuple
def add(a, b):
    return a + b

three = add((1, 2))
Run Code Online (Sandbox Code Playgroud)