在Python中替換switch語句?

我想用Python編寫一個函數,該函數根據輸入索引的值返回不一樣的固定值。 html

在其餘語言中,我將使用switchcase語句,可是Python彷佛沒有switch語句。 在這種狀況下,推薦的Python解決方案是什麼? python


#1樓

若是您有一個複雜的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()

#2樓

擴展「 dict as switch」的想法。 若是要爲開關使用默認值: code

def f(x):
    try:
        return {
            'a': 1,
            'b': 2,
        }[x]
    except KeyError:
        return 'default'

#3樓

若是您想要默認值,則可使用字典get(key[, default])方法: htm

def f(x):
    return {
        'a': 1,
        'b': 2
    }.get(x, 9)    # 9 is default if x not found

#4樓

def f(x):
     return 1 if x == 'a' else\
            2 if x in 'bcd' else\
            0 #default

簡短易讀,具備默認值,並支持條件和返回值中的表達式。 索引

可是,它比使用字典的解決方案效率低。 例如,Python必須先掃描全部條件,而後再返回默認值。 get


#5樓

定義: 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()合併字典。 它仍然比我想要的還要難看,可是它具備在表達式上使用哈希查找的基本效率,而不是循環遍歷全部鍵。

相關文章
相關標籤/搜索