2

次のような関数があるとします。

myFunction(arg, arg, kwarg, arg, arg, kwarg, etc...):

arg は *arg で、kwarg は *kwarg です。今まで、私の関数は次のように見えmyFunction(*args):、*args の長いリストだけを使用していました。このような大きなリストを渡すだけでした。

myFunction(*bigList):

bigList は次のようになりました =[[1,2,3],[4,5,6],'hello',[1,3,5],[2,4,6],'world',etc...]

しかし、今では 3 番目の引数ごとに kwarg が必要です。したがって、私の考えでは、リストは次のように「見える」ようになりました。

newBigList = [[1,2,3],[4,5,6],word='hello',[1,3,5],[2,4,6],word='world',etc...]

したがって、これを機能させるには 2 つの質問があります。

1)関数が実際の引数としてそれを読み込まずに、kwargの文字列でリストを作成できますか? のword(s) はnewBigList文字列でしょうか?

2) kwargs と args を交互に使用できますか? kwargs は通常辞書で行われることを知っています。両方を交互に使用することは可能ですか?

いつものように、これを行うためのより良い方法を誰かが知っている場合は、喜んで変更します。

編集方法は次のとおりです。多角形(または多角形の束)をプロットするmatplotlibメソッド:

plot([x1], [y1], color=(RBG tuple), [x2], [y2], color=(RGB tuple), etc...)

は最初のポリゴン[x1]の x 値のリスト、[y1]は最初のポリゴンの y 値のリストなどです。

問題は、color 引数に RBG 値を使用するには、color キーワードを含める必要があることです。さらに複雑なことに、random.random()モジュールを使用してランダムなタプルを生成しています。

したがって、すべてのポリゴンの x 値のリストのリスト、すべてのポリゴンの y 値のリストのリスト、およびランダムな RBG 色のタプルのリストがあります。それらは次のようになります。

x = [[1,2,3], [4,5,6], [7,8,9]]
y = [[0,9,8], [7,6,5], [4,3,2]]
colors = [(.45, .645, .875), (.456, .651, .194), (.813, .712, .989)]

したがって、プロットするポリゴンは 3 つあります。キーワードをできるようになる前に私がしていたことはzip、それらをすべて 1 つのタプルにまとめて、このように使用することでした。

list_of_tuples = zip(x, y, colors)
denormalized = [x for tup in list_of_tuples for x in tup]
plot.plot(*denormalized)

しかし、今はそれらのキーワードが必要です。また、必要に応じてさらに情報を提供させていただきます。ありがとう

4

3 に答える 3

3

やろうとしていることを実行できない理由はいくつかあります。

  • 関数呼び出しでキーワードを 1color=something, ..., color=otherだけ指定できるため、例外が発生します。
  • キーワード引数と定位置引数を混在させることはできないためx1, y1, color=something, x2、エラーになります。
  • これが期待どおりに機能したとしても、次matplotlibのようなドキュメントがまだあります。

    1 つのプロット コマンドで複数の行を作成する場合、kwargs はそれらすべての行に適用されます。

    color=つまり、1 つの行だけに使用したり、各行に 1 回使用したりすることはできません。これは「グローバル」プロパティです。各行に異なる色を指定する場合は、他の方法で線の色を指定する必要があります。


あなたの質問により、位置引数とキーワード引数がどのように機能するかが明確にわからないと思うので、この点について手がかりを与えようとします.

まず、さまざまな種類のパラメーターがあります。違いを説明する例を紹介します。

def a_function(pos_kw1, pos_kw2, *args, kw_only)

この関数には次のものがあります。

  • 位置引数またはキーワード引数の両方pos_kw1pos_kw2割り当てることができる2 つのパラメーター
  • 位置引数だけ*argsで指定できるパラメーター
  • キーワード引数でのみkw_only指定できるパラメーター

注:デフォルト値は、キーワード パラメータであることとは関係ありません。パラメータを不要にするだけです。

引数の受け渡しのメカニズムを理解するために、Python が関数呼び出しを実行する場合 (例:

a_function(1, 2, *'abc', kw_only=7)

最初に、すべての位置引数をタプルに収集します。上記の場合、結果のタプルは になりpos_args = (1, 2, 'a', 'b', 'c')、すべてのキーワード引数を に収集しますdict。この場合kw_args = {'kw_only': 7}、その後、関数を呼び出します。

a_function(*pos_args, **kw_args)

注:dict順序付けられていないため、キーワードの順序は重要ではありません。

あなたの質問では、次のようなことをしたかったのです:

plot(x, y, color=X, x2, y2, color=Y, ...)

呼び出しは実際に関数を使用*pos_args**kw_argsているため:

  • color=Xの直後に が指定されたかどうかわかりませんy
  • color=Yの直後に が指定されたかどうかわかりませんy2
  • color=Xが以前に指定されたことを知りませんcolor=Y

当然の結果:同じ引数を複数回指定することはできません。Pythonには、どのオカレンスをどのパラメーターに割り当てる必要があるかを知る方法がないためです。また、関数を定義するときに、同じ名前の 2 つのパラメーターを使用することはできません。(いいえ、python は値のリストなどを自動的に作成しません。単にエラーを発生させます。)

python は最初*pos_argsにキーワード引数を考慮せずに展開し、その後で展開すると考えることもできます**kw_args。この用語で考えると、次のような関数呼び出しが明確に理解できます。

# naive intent: assign pos_kw1 via keyword and pos_kw2 via positional
# assuming python will skip positional that were already provided as keyword args

a_function(1, pos_kw1=2)

# or even:
a_function(pos_kw1=2, 1)   # hoping order matters

1は位置引数を介して割り当てられpos_kw1、キーワード引数を展開すると再割り当てされるため、意味がありません。

別の方法で説明すると、呼び出しa_function(*pos_args, **kw_args)*pos_argsは、次のような単純なタプルのアンパック操作です。

pos_kw1, pos_kw2, *args = pos_args

(python2 では を使用できませんが**argsパラメータは多かれ少なかれこのように機能します)。

タプルのアンパックは要素をスキップしません: タプルの連続する要素に割り当てるだけで、関数呼び出しも同様です:キーワードを介して位置引数が既に渡されているかどうかはチェックされず、最終的にはスキップされますそれらは単に盲目的に割り当てられています。

これらの制限により、キーワード引数の後に位置指定が現れる関数呼び出しを許可しても意味がないため、次のようなことはできません。

plot(x, y, color=X, x2, ...)

このような関数呼び出しを許可すると、キーワードの順序が重要である、または展開時に引数がスキップされる可能性があるなどと思わせるだけです。そのため、Python は単純にエラーを発生させ、この種のあいまいさを回避します。

于 2013-11-12T22:38:50.757 に答える