Peter Norvig 有一篇文章描述了 program to solve sudoku puzzles ,即使是最难的,通过结合确定性逻辑操作和可能的解决方案的智能遍历。后者是递归完成的;这是那个函数(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
”开头。这似乎是具有 s
最小值的解包元组 (len(values[s]),s
)。 Norvig 博士使用“_
”作为变量名只是为了表明它是“无关紧要”的结果,还是发生了其他事情?是否有时建议将“_
”作为变量名?在交互模式下,“_
”保存上一个操作的答案;非交互代码中是否有类似的功能?
更新
感谢您的好答案。我想答案是亚历克斯·马泰利(Alex Martelli)的“增值”;他指出,“_, 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,但他使用的成语是“装饰-排序-不装饰”的一个例子 [[DSU]] 除了用 min 代替 sort,而在今天的 Python 中 key=
可选参数通常是做 DSU 的最佳方式;-)。
关于python - 下划线 _ 作为 Python 中的变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1739514/