2011-09-17 35 views
0

我不喜歡使用大量的IF語句。這裏是我打什麼周圍,現在,在世界上具有使用大量的IF把它做的語句:在bash腳本中是否有一個等同於嚴重口音的Python?

首先,一些變量...

pick_level = 1 
lockpicking_level1_maxxp = 40 
lockpicking_level2_maxxp = 70 
lockpicking_level3_maxxp = 100 

現在,我們得到撬鎖。當選擇一個1到任意一個直到當前鎖定技能水平的最大xp除以2的隨機數時,纔會成功選擇。因此,對於1級是1到20之間的任何東西 - 等級2級,1和35之間的任何東西,3什麼和50之間1這是它會怎樣看與IF語句:

x = random.randint(1, 100) 
if pick_level == 1: 
    if x not in range(1, (lockpicking_level1_maxxp/2)): 
    print 'You failed to pick the lock' 
    ... 
elif pick_level == 2: 
    if x not in range(1, (lockpicking_level2_maxxp/2)): 
    etcetc 

我想什麼做的是確定基於pick_level價值的XP和沒有做一堆IF語句問同樣的問題一遍又一遍的。這將大大下降爲這樣的事情(使用重音符像在bash):

if x not in range(1, (lockpicking_level`pick_level`_maxxp/2)): 

這樣我可以通過具有自動成爲「lockpicking_level1_maxxp」,「lockpicking_level2_maxxp」或「lockpicking_level3_maxxp」代碼避免所有的IF語句基於pick_level的值是什麼。

它已經有一段時間,因爲我做的bash腳本了,所以我的工作原理可能是斷位的內存。我也知道``在Python高達3版本基本相同,使用再版(),所以這不會是如何做到這一點。有什麼辦法可以做到這一點,或者我堅持在所有地方寫出醜陋的IF語句?

我想我可以用一個字典,因爲這樣的:

lockpicking_maxxp = {1:20, 2:35, 3:50} 
... 
if x in range(1, lockpicking_maxxp[pick_level]): 

...但我不知道這正是我將如何建立自己的技術數據庫(雖然會可能最終成爲一個JSON文件。我喜歡JSON)

非常感謝您的寶貴時間。我期待更多地瞭解這個想法。

+3

使用的字典。凡是相當於使用'eval'是醜陋的,proner在給予無用的錯誤,很難理解,最糟糕的是完全不必要的。 – delnan

+1

嘗試閱讀面向對象編程。從長遠來看,它會使處理更復雜的東西變得更容易。 Shell/Bash腳本只有原始數據結構,python更好,dict和set使得生活變得更好。eval()和friends可以在shellcript中使用,但是在高級語言中它被認爲是不好的風格。但不要讓這阻止你,無論你如何做,編程都是非常有趣的! :D – sleeplessnerd

回答

2

您可以使用locals()獲取本地符號表作爲一個字典,並用它來獲取變量的值。即:

>>> pick_level = 1 
>>> lockpicking_level1_maxxp = 40 
>>> lockpicking_level2_maxxp = 70 
>>> lockpicking_level3_maxxp = 100 
>>> locals()["lockpicking_level%d_maxxp" % pick_level] 
40 
+1

-1:有很多更好的方法來解決OP的問題。 –

+0

同意。我不會親自設計我的代碼,但這是他所問的,不是嗎? – Avaris

+0

的確,就我的問題「是否可以動態地將一個值插入變量的名字」而言,這似乎是實現它的方法。正如已經提到的那樣,我會更好地使用字典,尤其是因爲我將不僅僅具有這種技能。但是,找到答案的好工作,這是一直在我心中留下一段時間的東西,今天它的使用出現了,所以我想我會試圖找出一勞永逸的答案:D –

2

每當你覺得有必要號碼添加到您的變量,你應該只使用一個列表:

pick_level = 1 
lockpicking_levels = [0,40, 70, 100] 

test = random.randint(1, 100) 

if test < lockpicking_levels[pick_level]/2: 
    print "you failed" 
else: 
    ... 
+0

感謝您的回覆!事實上,看起來我會更好地使用數據結構來保存值,所以我可以參考這一點。它不僅減少了IF語句,而且減少了變量混亂! –

4

Don't repeat yourself。使用數據結構,而不是單個對象儘可能:

lockpicking_maxxp = { 
    1: 40, 
    2: 70, 
    3: 100 
} 

x = random.randint(1, 100) 
if x > lockpicking_maxxp[pick_level]/2: 
    print 'You failed to pick the lock' 
    ... 

當然,你可能有其他的技能在這個遊戲中,所以你可能需要更多的東西一樣:

maxxp = { 
    'lockpicking': { 
     1: 40, 
     2: 70, 
     3: 100 
    }, 'trap_searching': { 
     1: 50, 
     ... 
    }, ... 
} 

skill = 'lockpicking' 
x = random.randint(1, 100) 
if x > maxxp[skill][level[skill]]/2: 
    print 'You failed to pick the lock' 
    ... 
+0

你說得對。當涉及到它的時候,當我不再去攻擊單個原型時,就會需要一個實際的數據結構來保存所有的東西。如果x不在範圍內(1,skill ['lockpicking'] [pick_level]): 技術上我想我會做一個叫做技能的defaultdict,然後我可以像你所建議的那樣做,稱之爲 來宣佈這個答案,因爲這是適合這種情況的編碼技術,但我認爲我應該正式將Avaris的答案標記爲「接受」,因爲他們用一種方式來動態地將一個值插入變量的名稱中:P –

相關問題