5

重複の可能性:
*args と **kwargs の意味は?

ソーシャル Web のマイニングを読んだところ、理解できない Python 構文に遭遇しました。

transforms = [(', Inc.', ''), (', Inc', ''), (', LLC', ''), (', LLP', '')]

"google, Inc.".replace(*transforms[0])

しかし、私がタイプすると

*transforms[0]

インタープリターでは、無効な構文であると表示されます。私はそれをグーグルで検索しましたが、Pythonドキュメントは実際には仕事に向いていません.

では、ここのアスタリスクはどういう意味ですか? 皆さん、ありがとうございました。

4

4 に答える 4

15

Pythonの*argument形式は、シーケンス内のすべての要素を使用し、argumentそれらを引数として関数に渡すことを意味します。

この特定のケースでは、これは次のように変換されます。

"google, Inc.".replace(', Inc.', '')

これは最も簡単に示されます:

>>> def foo(arg1, arg2):
...     print arg1, arg2
...
>>> arguments = ('spam', 'eggs')
>>> foo(*arguments)
spam, eggs

**kwダブルスター形式を使用して、キーワード引数を渡すこともできます。

>>> def foo(arg1='ham', arg2='spam'):
...     print arg1, arg2
...
>>> arguments = dict(arg2='foo', arg1='bar')
>>> foo(**arguments)
bar, foo

また、関数定義で同じスペルを使用して、任意の位置引数とキーワード引数をキャプチャできます。

>>> def foo(*args, **kw):
...     print args, kw
...
>>> foo('arg1', 'arg2', foo='bar', spam='eggs')
('arg1', 'arg2'), {'foo': 'bar', 'spam': 'eggs'}
于 2012-09-02T12:43:37.977 に答える
7

アスタリスクは iterable をアンパックします。例で説明するのが一番だと思います:

>>> def exampleFunction (paramA, paramB, paramC):
    print('A:', paramA)
    print('B:', paramB)
    print('C:', paramC)

>>> myTuple = ('foo', 'bar', 'baz')
>>> myTuple
('foo', 'bar', 'baz')
>>> exampleFunction(myTuple)
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    exampleFunction(myTuple)
TypeError: exampleFunction() takes exactly 3 arguments (1 given)
>>> exampleFunction(myTuple[0], myTuple[1], myTuple[2])
A: foo
B: bar
C: baz
>>> exampleFunction(*myTuple)
A: foo
B: bar
C: baz

ご覧のとおり、3 つの引数と 3 つの要素を持つタプルを取る関数を定義しまし。タプルの値を直接使用したい場合は、タプルを渡して機能させることはできません。各要素を個別に渡すこともできますが、それは非常に冗長です。代わりに、アスタリスクを使用してタプルをアンパックし、基本的にタプルの要素を引数として使用します。

不明な数のパラメーターを操作する場合、アンパック機能の 2 つ目の使用法があります。

>>> def example2 (*params):
    for param in params:
        print(param)

>>> example2('foo')
foo
>>> example2('foo', 'bar')
foo
bar
>>> example2(*myTuple)
foo
bar
baz

ここでアスタリスクを使用すると、渡された残りのすべての値を取得して iterable にパックするパラメーターを定義できるため、反復できます。

于 2012-09-02T12:49:13.187 に答える
3

渡されたタプルを引数のリストに変換します。そう

"google, Inc.".replace(*transforms[0])

になる

"google, Inc.".replace(', Inc.', '')

このようにして、渡される引数のリストをプログラムで構築できます (可変長が主な利点です)。

于 2012-09-02T12:43:26.417 に答える
0

Pythonチュートリアルのセクション4.7.4を確認してください:http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions

But if I type

*transforms[0]
in the interpreter, it says it is invalid syntax.

transforms [0]の前の*は、関数呼び出しでのみ意味があります。

リストの最初のタプルのデータを使用してこの呼び出しを行う別の方法は次のとおりです。

"Google、Inc。"。replace(transforms [0] [0]、transforms [0] [1])

于 2012-09-02T12:46:27.527 に答える