如果我有一个像这样的函数:
def f(a,b,c,d):
print a,b,c,d
那么为什么这样做是可行的:
f(1,2,3,4)
f(*[1,2,3,4])
但不是这样的:
f(*[1,2] , *[3,4])
f(*[1,2] , *[3,4])
^
SyntaxError: invalid syntax
编辑:关于信息,最初的问题是替换函数包装器中的一个参数。我想要替换输入的*args中的一个给定成员,并尝试执行以下操作:
def vectorize_pos(f,n=0):
'''
Decorator, vectorize the processing of the nth argument
:param f: function that dont accept a list as nth argument
'''
def vectorizedFunction(*args,**kwargs):
if isinstance(args[n],list):
return map(lambda x : f( *(args[:n]) , x , *(args[n+1,:]), **kwargs),args[n])
else:
return f(*args,**kwargs)
return vectorizedFunction
这就是问题的由来。我知道还有其他方法可以做同样的事情,但我只是想了解为什么解包一个序列有效,而不是更多。
发布于 2014-02-28 22:44:09
因为,根据Function call syntax,参数列表就是这样定义的
argument_list ::= positional_arguments ["," keyword_arguments]
["," "*" expression] ["," keyword_arguments]
["," "**" expression]
| keyword_arguments ["," "*" expression]
["," keyword_arguments] ["," "**" expression]
| "*" expression ["," keyword_arguments] ["," "**" expression]
| "**" expression
因此,每个函数调用只能传递一个* expression
。
发布于 2014-02-28 23:32:42
从Python3.5开始, in work。
PEP 448是用Python3.5实现的。引用PEP的话说,它允许:
任意位置拆包operators:
print(*1,*2,3) 1 2 3 3}
(** {'x':1},
,**{'z':3}) {‘x’:1,'y':2,'z':>>>
发布于 2014-02-28 22:40:11
您可以连接列表:
>>> f(*[1,2]+[3,4])
1 2 3 4
或者使用itertools.chain
>>> from itertools import chain
>>> f(*chain([1,2], [3,4]))
1 2 3 4
https://stackoverflow.com/questions/22098105
复制相似问题