如果我得到这个代码示例:
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 行中。
如果我得到这个代码示例:
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 行中。
for
for 循环在缩进下降到与语句相同或更低的行结束。
在你的例子中,那是在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
不要那样做。。
grid_values(grid).items()
循环在OR if d in digits and not assign(values, s, d)
:ifd
的末尾结束,digits
并且函数assign(values, s, d)
返回False
。
发生这种情况是因为return
语句停止了函数,因此循环(必须在函数中,因为它有returns
)在函数结束后被迫中断。