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。Norvig 博士是否使用“ _”作为变量名只是为了表明它是“无关紧要”的结果,还是发生了其他事情?是否有时_建议将“”作为变量名?在交互模式下,“ _”保存前一个操作的答案;非交互式代码中是否有类似的功能?

更新

谢谢你的好答案。我想答案是亚历克斯·马泰利(Alex Martelli)的“增值”;他指出,“_, vbl_of_interest”习语通常是 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]))

(不知道彼得写的是什么版本的 Python,但他使用的成语是“装饰-排序-不装饰”[[DSU]] 的一个例子,除了用 min 代替 sort,在今天的 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 回答