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
。 Norvig博士是否使用“_
”作为变量名称只是为了表明它是“不关心”的结果,还是其他事情正在发生?是否有时候建议将“_
”作为变量名?在交互模式中,“_
”保留前一操作的答案;在非交互式代码中是否有类似的功能?
感谢您的好答案。我猜答案是Alex Martelli的“增值”;他指出,“_,vbl_of_interest”成语通常是DSU习语的副作用,而这本身就很大程度上是不必要的。
答案 0 :(得分:68)
是的,_
是“不关心”的传统名称(不幸的是它在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正在撰写的Python版本是什么,但他使用的成语是“decorate-sort-undecorate”[[DSU]]的一个例子,除了min而不是sort,在今天的Python中{{{ 1}}可选参数通常是做DSU的最佳方式; - )。
答案 1 :(得分:9)
你是对的。在非交互模式下,_
没有特殊含义。实际上,Norvig只是想传达他并不关心那个变量的价值。
Offtopic:Norvig的那篇文章非常好。建议阅读。
答案 2 :(得分:9)
您的解释是正确的。除了交互模式_
中的特殊含义之外,它仅用作“不关心”变量名称,尤其是在解包时。