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イディオムの副作用であり、それ自体はほとんど不要であると指摘しています。
うん、_
は「ドントケア」の伝統的な名前です(残念ながら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を実行する最適な方法です;-)。
あなたは正しいです。非インタラクティブモードで_
には特別な意味はありません。実際、Norvigは、その変数の値を気にかけないことを伝えたいだけです。
オフトピック:Norvigによるその記事は非常に素晴らしいです。推奨読書。
あなたの解釈は正しいです。対話モードでの特別な意味の外側_
は、特に展開時に「ドントケア」変数名として使用されます。