web-dev-qa-db-ja.com

Pythonの変数名としてアンダースコア_

Peter Norvigには、決定論的な論理演算と可能な解決策のスマートトラバーサルを組み合わせて 数独パズルを解くプログラム を記述したエッセイがあります。後者は再帰的に行われます。ここにその関数があります( source ):

_def search(values):
    "Using depth-first search and propagation, try all possible values."
    if values is False:
        return False ## Failed earlier
    if all( len( values[s]) == 1 for s in squares): 
        return values ## Solved!
    ## Chose the unfilled square s with the fewest possibilities
    _,s = min( (len( values[s]), s) 
                for s in squares 
                if len(values[s]) > 1
            )
    return some( search( assign( values.copy(), s, d)) 
                for d in values[s]
            )
_

(私の目のためにいくつかのスペース、CR、およびタブを追加しました;ノービグ博士に謝罪します。)

コメントのすぐ下に「__,s_」で始まる行があります。それは、sの最小値を持つアンパックされたタプル(len(values[s]),s)のようです。 Norvig博士は、変数名として「___」を使用して、単に「ドントケア」の結果であることを示していますか、それとも何かが進行中ですか?変数名として「___」が推奨される場合はありますか?対話モードでは、「___」は前の操作の答えを保持します。非対話型コードに同様の機能はありますか?

更新

良い答えをありがとう。答えは「付加価値」のためにアレックス・マルテリに行くと思います。彼は、「_、vbl_of_interest」イディオムは、多くの場合DSUイディオムの副作用であり、それ自体はほとんど不要であると指摘しています。

64
behindthefall

うん、_は「ドントケア」の伝統的な名前です(残念ながらI18Nでの使用と競合していますが、それは別の問題です;-)。ところで、今日のPythonでは、次の代わりに:

_,s = min( (len( values[s]), s) 
            for s in squares 
            if len(values[s]) > 1
        )

あなたはコーディングするかもしれません

s = min((s for s in squares if len(values[s])>1), 
        key=lambda s: len(values[s]))

(Python Peterがどのリリースを書いたかはわかりませんが、彼が使用しているイディオムは、ソートの代わりにminを除いて、 "decorate-sort-undecorate" [[DSU]]の例です。今日のPython the key=オプションパラメータは、一般にDSUを実行する最適な方法です;-)。

69
Alex Martelli

あなたは正しいです。非インタラクティブモードで_には特別な意味はありません。実際、Norvigは、その変数の値を気にかけないことを伝えたいだけです。

オフトピック:Norvigによるその記事は非常に素晴らしいです。推奨読書。

9
Stephan202

あなたの解釈は正しいです。対話モードでの特別な意味の外側_は、特に展開時に「ドントケア」変数名として使用されます。

9
mikej