Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将元组扩展为参数_Python_Tuples_Parameter Passing - Fatal编程技术网

Python 将元组扩展为参数

Python 将元组扩展为参数,python,tuples,parameter-passing,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") 我知道可以将myfun定义为myfun((a,b,c)),但当然

有没有办法将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")
我知道可以将
myfun
定义为
myfun((a,b,c))
,但当然也可能有遗留代码。 谢谢

myfun(*一些元组)
完全按照您的要求执行。
*
运算符只需解压缩元组(或任何iterable)并将其作为位置参数传递给函数。阅读更多信息。

myfun(*一些元组)
完全按照您的要求执行。
*
运算符只需解压缩元组(或任何iterable)并将其作为位置参数传递给函数。阅读更多信息。

查看第4.7.3节和第4.7.4节。 它讨论将元组作为参数传递

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

看看第4.7.3节和第4.7.4节。 它讨论将元组作为参数传递


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

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

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

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

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

这是函数式编程方法。它将元组扩展功能提升到语法之外:

apply_tuple = lambda f, t: f(*t)
重新定义
apply\u tuple
via,从长远来看可以节省大量
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'

这是函数式编程方法。它将元组扩展功能提升到语法之外:

apply_tuple = lambda f, t: f(*t)
重新定义
apply\u tuple
via,从长远来看可以节省大量
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'

与@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))

与@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))


似乎只有当扩展的元组位于通常提供的参数之后时,您才能这样做-解释器不喜欢我这样做:
some\u func(*tuple\u of\u stuff,另一个参数)
@Quackmatic在Python 3.5中,在任何位置都有扩展的元组似乎都可以正常工作。1@Quackmatic附议@River,这在Python3.5.4中运行良好:
def func(a,b,c,d):打印(a,b,c,d)
with
args=('fee','fi','fo');func(*args,'fum')
似乎只有当扩展的元组位于通常提供的参数之后时,才可以这样做-解释器不喜欢我这样做:
一些func(*tuple\u of_stuff,另一个_参数)
@Quackmatic在Python 3.5中,将扩展的元组放在任何位置似乎都可以正常工作。1@Quackmatic附议@River,这在Python3.5.4中运行良好:
def func(a,b,c,d):打印(a,b,c,d)
with
args=('fee','fi','fo');func(*args,'fum')
这对初学者没有帮助。它使用第三方模块,并做其他令人困惑的事情…toolz是第三方的,这是我的意思不是每个答案都必须适合初学者对于你给出的示例,可以使用
starmap
这是一个糟糕的答案这对初学者没有帮助。它使用第三方模块,并做其他令人困惑的事情…toolz是第三方的,这是我的意思不是每个答案都必须适合初学者对于您给出的示例,可以使用
starmap
这是一个糟糕的答案*操作符只是将元组解包并将它们作为位置参数传递给函数。请注意,列表和元组可以使用相同的语法。我发现列表(事实上,任何iterable,包括字符串)也可以使用相同的语法,但不确定它们的可变性如何影响事情。*操作符只需将元组解包并将它们作为位置参数传递给函数。请注意,列表和元组可以使用相同的语法。我发现列表(事实上,任何iterable,包括字符串)也可以使用相同的语法,但不确定它们的可变性如何影响事情。您还可以定义:def add(some_tyuple:tuple)然后使用索引进行访问您还可以定义:def add(some_tyuple:tuple)然后使用索引进行访问