def withPositionalArgs(*args):
print args, type(args)
def withTupleAsArgument(tupleArg):
print tupleArg, type(tupleArg)
a=1
b=2
c=[10,20]
print withPositionalArgs(a,b,c)
print withTupleAsArgument(tuple([a,b,c]))
当我运行此代码时:
(1, 2, [10, 20]) <type 'tuple'>
None
(1, 2, [10, 20]) <type 'tuple'>
None
怀疑:
由于位置参数作为元组传递,这两个函数调用之间是否存在技术上的差异?如果我在调用时已经可以创建一个元组,是否需要使用Positional参数?没有他们的东西也可以工作,不是吗?或者有什么我没有理解或忽略的东西?
答案 0 :(得分:1)
不,两者之间没有区别。在第一个中,你的args最终是一个元组,第二个是你发送一个元组。
答案 1 :(得分:1)
您需要问自己如何使用您的功能。将参数视为一组不相关的值更为自然,在这种情况下,位置参数更有意义。或者这些值构成一个相关的组,在这种情况下,元组更有意义。
您还需要考虑如何使用您的功能。假设你有一个功能 返回一个值元组:
def foo():
return 1,2,3
并且您想要编写一个函数bar
,其参数是foo
返回的值。你的两个选择是
# Take a sequence of values and store them in a tuple called args
def bar1(*args):
print args[0]
# Take a tuple of values and store it in t
def bar2(t):
print t[0]
以下是一些可以调用这两个函数的方法,使用foo
的返回值作为参数:
>>> bar1(foo()) # Receives a single tuple-valued argument
(1, 2, 3)
>>> bar1(*foo()) # Receives 3 integer arguments
1
>>> bar2(foo()) # Receives a single tuple-valued argument
1
>>> bar2(*foo()) # Receives 3 arguments, but only expected 1!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: bar2() takes exactly 1 argument (3 given)
因此,bar1
和bar2
之间的选择实际上取决于您对预期的使用方式。
答案 2 :(得分:0)
最大的区别在于位置参数“* args”方式允许人们在运行时调用一个他不知道参数数量的函数,并且仍然具有与“普通”函数相同的函数其他电话。
当一个函数作为参数发送到另一段代码时,通常(但不是唯一)使用它,或者,编写一个函数包装器,它将接收“N”参数并将那些“N”参数传递给原始函数,不关心他们。
这是使Python中的动态代码编写如此出色的重要部分。
例如:
def MySum(a,b):
return a + b
def logger(func):
def wrapper(*args):
print args
return func(*args)
return wrapper
MySum = logger(MySum)
此代码片段创建一个装饰器来打印传递给函数的arguemtns,仍然可以使用任何仅使用位置参数调用的函数。(添加关键字参数将使其适用于任何可调用的函数。)
使用MySun
原始版本的任何代码仍然可以继续保持不变。
如果使用普通元组将参数传递给装饰器,则必须相应地修改调用代码。