0
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

疑問:

位置引数はタプルとして渡されるため、これら 2 つの関数呼び出しに技術的な違いはありますか? 呼び出し時にすでにタプルを作成できる場合、位置引数を使用する必要はありますか? それらがなくても物事は機能しますね。それとも、私が理解していない、または無視していないものがありますか?

4

3 に答える 3

1

関数がどのように使用されるかを自問する必要があります。引数を無関係な値のセットと考える方が自然ですか? その場合、位置引数の方が理にかなっています。または、値が関連するグループを形成する場合、タプルがより理にかなっています。

また、関数の使用方法も考慮する必要があります。値のタプルを返す関数があるとします。

def foo():
    return 1,2,3

barそして、引数が によって返される値である関数を書きたいとしますfoo。あなたの2つの選択肢は

# 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引数として直接使用して、2 つの関数のそれぞれを呼び出す方法を次に示します。

>>> 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するかは、それがどのように使用されるかによって異なります。

于 2012-09-08T14:38:19.283 に答える
1

いいえ、両者に違いはありません。最初のものでは、引数はタプルになり、2番目のものはタプルを送信しています。

于 2012-09-08T13:43:33.920 に答える
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)

このコード スニペットは、関数に渡された引数を出力するデコレータを作成しますが、位置引数のみで呼び出された任意の関数で機能します (キーワード パラメータを追加すると、任意の呼び出し可能オブジェクトに対して機能するようになります)。

の元のバージョンを使用したコードMySunは、変更せずに引き続き使用できます。通常のタプルを使用してパラメーターをデコレーターに渡す場合、呼び出しコードをそれに応じて変更する必要があります。

于 2012-09-08T14:41:40.480 に答える