2013-10-17 526 views
7

我有以下代碼:Python:if-endif-statement在哪裏結束?

for i in range(0,numClass): 
    if breaks[i] == 0: 
     classStart = 0 
    else: 
     classStart = dataList.index(breaks[i]) 
     classStart += 1 
classEnd = dataList.index(breaks[i+1]) 

classList = dataList[classStart:classEnd+1] 

classMean = sum(classList)/len(classList) 
print classMean 
preSDCM = 0.0 
for j in range(0,len(classList)): 
    sqDev2 = (classList[j] - classMean)**2 
    preSDCM += sqDev2 

SDCM += preSDCM 
return (SDAM - SDCM)/SDAM 

我想這個代碼轉換爲VB.NET。

但我不確定if-elseif語句的結束位置。 它在「classStart + = 1」之後結束了嗎?

我覺得有點難以看出for-next-loop在Python中的結局。

的代碼是從http://danieljlewis.org/files/2010/06/Jenks.pdf

採取謝謝。

回答

8

是的。 Python使用縮進標記塊。 iffor都在那裏結束。

+0

很酷,謝謝。你能告訴我雙星號(**)在這一行中的含義嗎? sqDev2 =(classList [j] -classMean)** 2 – tmighty

+0

意味着「權力」,相當於^在許多語言中。 ** 2(平方),** 3(立方) – Jblasco

+0

它意味着「權力」,或在某些語言中是'^'(Python使用它來逐位異或)。 –

4

在Python中,縮進塊的結束位置,即塊的結束位置。因此,例如,考慮了一下簡單的代碼:

myName = 'Jhon' 
if myName == 'Jhon': 
    print(myName * 5) 
else: 
    print('Hello') 

現在,當你運行該代碼(請務必從一個單獨的模塊從交互式提示符下運行它,而不是),將打印「約翰」十二五次(請注意,Python將按照指定的方式精確處理對象,它甚至不會嘗試將變量myName的值轉換爲乘法數),就是這樣。這是因爲if塊內的代碼塊只被執行。請注意,如果else關鍵字放在if語句之下的任何位置,或者如果您混合使用了製表符和空格,則Python會引發錯誤。現在

,在你的代碼,

for i in range(0,numClass): 
    if breaks[i] == 0: 
     classStart = 0 
    else: 
     classStart = dataList.index(breaks[i]) 
     classStart += 1 

看看,那裏的代碼的for塊的縮進開始?一個選項卡,因此,在for語句後縮進一個選項卡的所有內容都將位於for塊內。現在,顯然if語句位於for語句的內部,因此它在for語句中。現在,我們轉到下一行classStart = 0 - 這是從for語句縮進的兩個選項卡和if語句的一個選項卡;因此它位於if語句內部。下一行,您有一個else關鍵字只縮進for語句中的一個選項卡,但不包含兩個選項卡,因此它位於if語句內的for語句和而不是之內。

考慮將大括號這樣的,如果你用另一種語言(S)已編碼前:

for i in range(0,numClass) 
{ 
    if breaks[i] == 0 
     { 
     classStart = 0 
     } 
    else 
     { 
     classStart = dataList.index(breaks[i]) 
     classStart += 1 
     } 
} 

簡單的區別是,你是不是把括號爲你的表情必須的,除非,你想強制運算符優先規則,並且不需要這些大括號,而只需將它們同等縮進即可。