2014-03-31 30 views
0

我試圖在利用pygame的Python程序中壓縮重複。我現在有一些行數是這樣的:Python:在for循環中使用變量進行替換

if pygame.key.get_pressed()[pygame.K_q]: q.PerformNote() 
if pygame.key.get_pressed()[pygame.K_w]: w.PerformNote() 
if pygame.key.get_pressed()[pygame.K_e]: e.PerformNote() 
if pygame.key.get_pressed()[pygame.K_r]: r.PerformNote() 
if pygame.key.get_pressed()[pygame.K_t]: t.PerformNote() 

我想實現這樣的事情:

keyList = ['q', 'w', 'e', 'r', 't'] 
for currentKey in keyList: 
    if pygame.key.get_pressed()[pygame.K_currentKey]: 
     currentKey.PerformNote() 

產生的誤差是

AttributeError: 'module' object has no attribute 'K_currentKey'

我想我可能在BASH最近花了太多時間,因爲這個結構對我的大腦來說非常有意義。我已經搜索了四周,不知道實現這一點的正確方法。

+1

看看[getattr](https://docs.python.org/2/library/functions.html#getattr) – vanza

+3

your keyList應該包含pygame.K_ *,而不是直接使用字母名稱 – njzk2

+0

(同樣,在bash中將會有東西指示變量的使用。可能是$ {}或其他東西)。 – njzk2

回答

6

地圖pygame的鑰匙到其對應的變量:

keyMap = { 
    pygame.K_q: q, 
    pygame.K_w: w, 
    pygame.K_e: e, 
    pygame.K_r: r, 
    pygame.K_t: t, 
} 

然後,你可以這樣做:

pressed = pygame.key.get_pressed() 
for key, toProc in keyMap.items(): 
    if pressed[key]: 
     toProc.PerformNote() 
+0

我很欣賞這個例子,我認爲整個事情看起來很有趣,但我無法弄清楚爲什麼。它像一個魅力! – user3482826

1

,如果你想要從它的名字的字符串類成員,然後嘗試:

keyList = ['q', 'w', 'e', 'r', 't'] 
for currentKey in keyList: 
    if pygame.key.get_pressed()[getattr(pygame, 'K_' + currentKey)]: 
     currentKey.PerformNote() 
+0

我很欣賞回答我的問題,同時仍然使用我有點破碎的設計。 – user3482826