1

如果我得到这个代码示例:

for s,d in grid_values(grid).items():
    if d in digits and not assign(values, s, d):
        return False ## (Fail if we can't assign d to square s.)
return values

我怎么知道 for 结束的地方?因为据我所知,您可以将所有这些写在 1 行中。

4

2 回答 2

6

forfor 循环在缩进下降到与语句相同或更低的行结束。

在你的例子中,那是在return values声明中。

if语句变为 True 并return False执行语句时,循环也将终止;该函数在该点返回“早期”,并忽略循环的其余部分。

正如所写,您不能将代码减少到一行,因为您不能在一行上组合多个复合语句(采用缩进代码块的语句)。any()您可以使用带有生成器表达式的函数调用将其减少到两行,替换for语句,但我认为它不会提高可读性:

if any(not assign(values, s, d) for s, d in grid_values(grid).items() if d in digits):
    return False
return values

然后,您可以使用条件表达式将所有内容塞进一行,以进一步破坏可读性:

return False if any(not assign(values, s, d) for s, d in grid_values(grid).items() if d in digits) else values

不要那样做。。

于 2013-03-16T15:57:11.473 回答
3

grid_values(grid).items()循环在OR if d in digits and not assign(values, s, d):ifd的末尾结束,digits并且函数assign(values, s, d)返回False

发生这种情况是因为return语句停止了函数,因此循环(必须在函数中,因为它有returns)在函数结束后被迫中断。

于 2013-03-16T15:57:14.603 回答