我想用Python編寫一個函數,該函數根據輸入索引的值返回不一樣的固定值。 html
在其餘語言中,我將使用switch
或case
語句,可是Python彷佛沒有switch
語句。 在這種狀況下,推薦的Python解決方案是什麼? python
若是您有一個複雜的case塊,能夠考慮使用函數字典查找表... 函數
若是您還沒有執行此操做,那麼最好進入調試器並準確查看字典如何查找每一個函數。 spa
注意: 不要使用「()」的狀況下/字典查找內部或它會調用每一個函數被建立字典/ case塊。 請記住這一點,由於您只想使用哈希樣式查找一次調用每一個函數。 調試
def first_case(): print "first" def second_case(): print "second" def third_case(): print "third" mycase = { 'first': first_case, #do not use () 'second': second_case, #do not use () 'third': third_case #do not use () } myfunc = mycase['first'] myfunc()
擴展「 dict as switch」的想法。 若是要爲開關使用默認值: code
def f(x): try: return { 'a': 1, 'b': 2, }[x] except KeyError: return 'default'
若是您想要默認值,則可使用字典get(key[, default])
方法: htm
def f(x): return { 'a': 1, 'b': 2 }.get(x, 9) # 9 is default if x not found
def f(x): return 1 if x == 'a' else\ 2 if x in 'bcd' else\ 0 #default
簡短易讀,具備默認值,並支持條件和返回值中的表達式。 索引
可是,它比使用字典的解決方案效率低。 例如,Python必須先掃描全部條件,而後再返回默認值。 get
定義: it
def switch1(value, options): if value in options: options[value]()
容許您使用至關簡單的語法,將案例捆綁到地圖中:
def sample1(x): local = 'betty' switch1(x, { 'a': lambda: print("hello"), 'b': lambda: ( print("goodbye," + local), print("!")), })
我一直試圖以一種讓我擺脫「 lambda:」的方式從新定義開關,可是放棄了。 調整定義:
def switch(value, *maps): options = {} for m in maps: options.update(m) if value in options: options[value]() elif None in options: options[None]()
容許我將多個案例映射到同一代碼,並提供默認選項:
def sample(x): switch(x, { _: lambda: print("other") for _ in 'cdef' }, { 'a': lambda: print("hello"), 'b': lambda: ( print("goodbye,"), print("!")), None: lambda: print("I dunno") })
每一個重複的案例都必須放在本身的字典中; 在查找值以前,switch()合併字典。 它仍然比我想要的還要難看,可是它具備在表達式上使用哈希查找的基本效率,而不是循環遍歷全部鍵。