替换Positional参数 - 使用或不使用tuple参数调用函数

时间:2012-09-08 13:40:39

标签: python arguments tuples

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参数?没有他们的东西也可以工作,不是吗?或者有什么我没有理解或忽略的东西?

3 个答案:

答案 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)

因此,bar1bar2之间的选择实际上取决于您对预期的使用方式。

答案 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原始版本的任何代码仍然可以继续保持不变。 如果使用普通元组将参数传递给装饰器,则必须相应地修改调用代码。