70

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、およびタブを追加しました。Norvig 博士に謝罪します。)

コメントのすぐ下に " _,s" で始まる行があります。len(values[s]),sそれは、 の最小値を持つ展開されたタプル ( ) のようですs。Dr. Norvig_は変数名として " " を使用して、それが「どうでもいい」結果であることを示しているだけですか、それとも何か他のことが起こっているのでしょうか? _変数名として「 」が推奨される場合はありますか? 対話モードでは、" _" は前の操作の答えを保持します。非対話型コードに同様の機能はありますか?

アップデート

良い答えをありがとう。The Answer は、「付加価値」のために Alex Martelli に行くと思います。彼は、"_, vbl_of_interest" イディオムは DSU イディオムの副作用であることが多く、DSU イディオム自体はほとんど不要になっていると指摘しています。

4

3 に答える 3

75

はい、_「ドントケア」の伝統的な名前です (残念ながら 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]))

(Peter がどのリリースの Python のために書いていたかはわかりませんが、彼が使用しているイディオムは、「装飾-並べ替え-非装飾」[[DSU]] の例です。ただし、並べ替えではなく最小であり、現在の Python では、key=オプションのパラメーターは通常、 DSU を実行する最良の方法;-)。

于 2009-11-16T00:54:30.653 に答える
12

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

于 2009-11-16T00:50:53.963 に答える
9

あなたは正しいです。非対話モード_では特別な意味はありません。実際、Norvig はその変数の値を気にしないことを伝えたいだけです。

オフトピック: Norvig の記事はとてもいいです。おすすめの一読。

于 2009-11-16T00:48:42.003 に答える