At http://norvig.com/sudoku.html, there's an essay describing a Python 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 the function (from http://norvig.com/sudo.py):
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. My question is this: 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?
UPDATE: 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 sorting idiom, which itself has been made largely unnecessary by the addition of sorting functions.