2013-03-16 91 views
1

中结束。如果我得到这个代码示例:哪里呢for循环蟒蛇

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 

我怎么能知道其中的结束?因为据我所知,你可以把所有这些写在一行中。

+0

http://docs.python.org/2/tutorial/controlflow.html#for-statements – ChrisW 2013-03-16 15:57:18

+0

http://docs.python.org/2/reference/lexical_analysis.html#indentation – 2013-03-16 15:57:48

+2

你无法写所有这一切在一行。 Python语法不允许将块嵌入单行内的块中。 – user4815162342 2013-03-16 15:59:09

回答

3

环路在grid_values(grid).items(),或者如果年底结束d in digits and not assign(values, s, d):如果ddigits中,并且功能assign(values, s, d)返回False

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

6

for循环结束于缩进回落到与for语句相同或更低的行。

在您的示例中,即在return values声明。

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

正如你所写,你不能将代码减少到一行,因为你不能在一行中结合多个复合语句(带有缩进代码块的语句)。你可以用一台发电机表达的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 

不要做..