2017-01-17 22 views
2

この並列割り当ての仕組みを理解しようとしています。完全なコードはhereです。 (Raw GithubのPythonファイル)。ここで私が問題を抱えているものです:Python並列割り当て

def assign_move(square): 

    # Parallel Assignment 
    target, direction = max(
     ((neighbor, direction) for direction, neighbor in enumerate(game_map.neighbors(square)) 
           if neighbor.owner != myID), 
           default = (None, None), 
           key = lambda t: t[0].production) 

私は同じくらい私が知っているように、それを打破するだろうが、私はおそらく何か間違ったことをやっています。

target, direction = max(iterable, default, key) 

ターゲットと方向を同じものに割り当てていますか?

iterable = ((neighbor, direction) for direction, neighbor in enumerate(game_map.neighbors(square)) if neighbor.owner != myID) 

がどのように我々は、forループの前に(neighbor , direction)を持つことができます:私は、パラレル割り当てが今、私たちはiterableを見ればx, y = 5, 6

のようなものだと思った、それは次のようですか?ここではifのステートメントは何をしていますか? neighbor.owner != myIDの場合、ifブロックの下に実行する必要はありませんか?

イテレータが空の場合、次のようにNone, Noneが返されます。

default = (None, None), 

これは、最大値を決定するために使用する関数です。

key = lambda t: t[0].production) 

背景、必要な場合:これは、ゲームHaliteで再生するボットのコードです 。これはGitHub repoの中で見つけられたあらかじめ作成されたボットです。

+1

これは、 'if'文を使った' for'ループではありません。それは[フィルタを使ったリストの理解](https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions) – Hamms

+0

ああ完璧!私はその部分を何のために探すべきか分からなかった。 – Loaf

+2

@ハムス:Genexではなく、LC。角かっこはありません。 –

答えて

1

ここmax機能がneighbor.productionに関して(direction , neighbors)の最大tupleを返します(私たちはkeyからこれを理解したように)と隣人がneighbor.owner != myIDが発生した場合、この反復に参加することを許可されている、とイテレータが空だった場合default = (None, None)は次のようになりますtargetdirections値のため、targetneighborで、末尾にはほとんどproductionです。

+0

't [1] .production'なら' direction.production'でしょうか? – Loaf

+1

ええ、 't'はあなたの' tuple'だと仮定します。最初の要素は 'neighbor'で、2番目は' direction'です。 'direction'クラスに' production'メンバがあればエラーを返しません。 – Arman

+1

完璧!説明ありがとう。これは、 'for'や' if' is for 'ループやif/else文ではありません。 – Loaf

1

割り当ての左側に複数の変数がある場合は常に、その右側は、個々の変数に展開されている要素数が正確に多いシーケンスである必要があります。

場合によっては、右側が明示的にそのシーケンスを構築します。たとえば、x, y = 5, 6は、技術的にはタプル(5, 6)の構築であり、アンパックされます。 (実際には、Python 2.6以降、タプルの構築はここではなくなりましたが、それは決してあなたにとって重要ではない内部最適化です)。

ただし、正しい長さのシーケンスのソースはすべて右側に有効です。 target, direction = max(...)の例では、maxは2要素タプル(neighbor, direction)のリストから要素を選択しています。これらのうちの最大のもの(のキー=パラメータによって定義されたもの)が返され、ターゲットと方向に展開されます。

+0

ありがとう!最初は、max(...)が単一の値だけを返すとは考えていませんでした。 – Loaf