2011-02-10 18 views
6

我是一個'python新手',並試圖掌握字典數據類型的內部工作。昨天晚上,我試圖用openGL程序中的鍵盤輸入作爲控制結構(即switch語句)。Python:使用字典作爲開關不工作

問題是由於某些原因,字典繼續評估所有案例(兩個在這種情況下),而不是從按下的鍵。

下面是一個例子的代碼:

def keyboard(key): 
    values = { 
    110: discoMode(), 
    27: exit() 
    } 
    values.get(key, default)() 

我花了一個多小時,昨晚試圖找到答案,爲什麼每一個「案例」進行評估,我已經有了一些想法,但無法清楚地找到「爲什麼」問題的答案。

那麼,有人會向我解釋爲什麼當我點擊'n'鍵(ascii表示爲110)時,這段代碼也評估27(ESC鍵)下的條目嗎?

道歉如果這個話題已被毆打致死但我看了,無法輕鬆找到明確的答案(也許我錯過了它)。

謝謝。

回答

3
def keyboard(key): 
    values = { 
    110: discoMode(), 
    27: exit() 
    } 

在這種情況下,要構建包含「()退出」返回值「discoMode()」分配給110,和返回值的字典到27

你是什麼意思寫:

def keyboard(key): 
    values = { 
    110: discoMode, 
    27: exit 
    } 

這將分配110功能discoMode(不調用函數!),同樣退出。記住函數是第一類對象:它們可以被分配,存儲和從其他變量中調用。

15

您不應該調用這些函數。就在函數對象本身存儲在字典中,沒有他們的返回值:

def keyboard(key): 
    values = { 
     110: discoMode, 
     27: exit 
    } 
    values.get(key, default)() 

f()是功能f呼叫並評估該調用的返回值。 f是函數對象本身。

+0

並確保'default'的值同樣是一個函數對象(即調用'default()'是合法的,並且做一些合理的事情。) –

0

只需刪除括號,以便引用函數而不是調用函數的結果。否則,你明確地說:「調用這個函數來獲取與這個鍵關聯的值」。

def keyboard(key): 
    values = { 
    110: discoMode, 
    27: exit 
    } 
    values.get(key, default)()