2011-01-13 38 views
3

在有趣的Python語言中深入潛水,因此在語言中沒有任何開關可以作爲構造。所以使用字典是閱讀學習python第一版的第一選擇。於是,我就某事像,帶功能的另一個開關盒

cases = { 2 : readt3(e,t,off, partElems, partsNodes), # to read the triangular elements 
      3 : readq4(e,t,off, partElems, partsNodes), # to read the quadrangular elements 
      5 : readh8(e,t,off, partElems, partsNodes), # to read the hexa elements 
     }  
# define functions 
def readt3(e, t, off, partElems, partsNodes, partPnt): 
    partsElems[partPnt].append(e) 
    nods = t[offset: offset+3]; 
    for n in nods: 
     partsNodes[partPnt].append(n) 
    return 

,並得到了錯誤「readt3是不確定的」,我想我得到了這個,因爲它沒有被定義之前的話,那麼移動的功能定義了上述情況,但仍是同樣的問題,但這一次「e沒有定義」我不明白這一點,所以e是一個函數參數,爲什麼我在e上得到一個定義相關的錯誤?

在這種情況下,在模擬開關盒的情況下,應該將函數定義放在哪裏?

+0

+1以平衡-1票。請當你投票-1時,給出一個理由。這個問題對我來說看起來像一個基本的初學者問題。 – 2011-01-13 15:42:30

+0

我也想知道爲什麼有一個-1,是的,我是一個Python初學者... – 2011-01-13 15:44:45

+0

Python缺乏switch語句是我愛Python的許多原因之一。現在,您正在使用一種易於閱讀且易於維護的戰略模式。我建議您在選擇的答案中使用策略模式時,使用一些更好的命名。你選擇的命名使得它看起來像是在你正在使用一種良好的習慣時,你正在圍繞python缺乏病例陳述進行編碼。 – marr75 2011-01-13 16:33:52

回答

9

當你正在做這樣的事情:

... 
2 : readt3(e,t,off, partElems, partsNodes) 
... 

其實你正在評估(呼叫)功能readt3的論據e,t,off, partElems, partsNodes什麼,我想你想要做的就是這樣的事情(模擬開關case語句):

def readt3(e, t, off, partElems, partsNodes, partPnt): 
    partsElems[partPnt].append(e) 
    nods = t[offset: offset+3]; 
    for n in nods: 
     partsNodes[partPnt].append(n) 
    return 

# And of course all your function definition should be here before the cases dict. 

cases = { 2 : readt3, # to read the triangular elements 
      3 : readq4, # to read the quadrangular elements 
      5 : readh8, # to read the hexa elements 
     } 

,現在你可以打電話給一個case說法你這樣的情況:

case = 2 

cases[case](e,t,off, partElems, partsNodes) 
0
cases = { 2 : readt3(e,t,off, partElems, partsNodes), 

在這裏,您正在調用參數e,t,off等未定義的函數readt3。

1

該字典並不打算用作構造。它不用於存儲結構,而是用於存儲真實數據。在你的情況下,我認爲最好定義一個對象。考慮在這種情況下使用面向對象。

2

實際上,使用dictionaies來發送呼叫是一件有時可以做到的事情,它有意義,什麼時候知道你在做什麼。

其他語言中用於代替「switch...case」的Python語法構造是「if..elif..else」。

我不知道爲什麼人們根本不去。這就像一個人會「失去表現」或其他。但是,人們認爲,開關案件是if-else鏈的一個極其狹隘的特例:它只是允許比較平等,只是比較整數(至少在C中,我不知道每個語言在那裏克隆C語法),而在if-elif鏈中,可以使用任何表達式。

很容易察覺到Switch case語句剛剛在C中引入,因爲它允許編譯器自動優化這種特殊情況(使用跳轉表而不是一系列比較)。但是......只對編譯語言有意義,然後,只有在編譯器無法單獨處理這些優化時纔有意義,即使如此,只有在10或20比較的速度差異是大於使用跳轉表。如你所見,在現代高級語言中有一個「switch case」是相當多餘的,那是因爲你可以鏈接if-elif-else語句。