2013-03-16 179 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 

不要做..