Peter Norvig has an essay describing a program to solve sudoku puzzles, even the hardest ones, by combining deterministic logical operations and smart traversal of the possible solutions. The latter is done recursively; here's that function (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] )
(I've added some spaces, CRs, and tabs for the sake of my eyes; apologies to Dr. Norvig.)
Right below the comment there's a line starting with "_,s
". That seems to be the unpacked tuple (len(values[s]),s
) with the minimal value of s
. Is Dr. Norvig using "_
" as a variable name just to indicate it's a "don't care" result, or is something else going on? Are there times when "_
" is recommended as a variable name? In interactive mode, "_
" holds the answer of the previous operation; is there a similar function in non-interactive code?
Thanks for the good answers. I guess The Answer goes to Alex Martelli for "value added"; he points out that the "_, vbl_of_interest" idiom is often a side effect of the DSU idiom, which itself has been made largely unnecessary.
The use of double underscore ( __ ) in front of a name (specifically a method name) is not a convention; it has a specific meaning to the interpreter. Python mangles these names and it is used to avoid name clashes with names defined by subclasses.
Rules for Python variables: A variable name must start with a letter or the underscore character. A variable name cannot start with a number. A variable name can only contain alpha-numeric characters and underscores (A-z, 0-9, and _ )
The python interpreter stores the last expression value to the special variable called _ . The underscore _ is also used for ignoring the specific values. If you don't need the specific values or the values are not used, just assign the values to underscore.
Variable names can never contain spaces. The underscore character ( _ ) can also appear in a name. It is often used in names with multiple words, such as my_name or price_of_tea_in_china .
Yep, _
is a traditional name for "don't care" (which unfortunately clashes with its use in I18N, but that's a separate issue;-). BTW, in today's Python, instead of:
_,s = min( (len( values[s]), s) for s in squares if len(values[s]) > 1 )
you might code
s = min((s for s in squares if len(values[s])>1), key=lambda s: len(values[s]))
(not sure what release of Python Peter was writing for, but the idiom he's using is an example of "decorate-sort-undecorate" [[DSU]] except with min instead of sort, and in today's Python the key=
optional parameter is generally the best way to do DSU;-).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With