您好,登錄后才能下訂單哦!
在Python中是沒有Switch / Case語句的,很多人認為這種語句不夠優雅靈活,在Python中用字典來處理多條件匹配問題字典會更簡單高效,對于有一定經驗的Python玩家不得不承認,的確如此。
但今天我們還是來看看如果一定要用Python來Switch / Case,可以怎么玩。
語法約束
我們先定義一下Switch/Case應該怎么表達,為了簡單我們可以讓它長成這樣。
def cn(): print('cn') def us(): print('us') switch(lang).case('cn',cn) truetruetrue.case('us',us) .default(us)
類實現一
通過以上約束,我們可以把switch當成一個類來實現,傳入的參數在構造函數里處理,然后再分別實現case和default方法即可。
class switch(object): def __init__(self, case_path): self.switch_to = case_path self._invoked = False def case(self, key, method): if self.switch_to == key and not self._invoked: self._invoked = True method() return self def default(self, method): if not self._invoked: self._invoked = True method()
在構造函數中我們記住了 case_path 和執行狀態 _invoked ,在 case() 里如果當前的 key 和 switch_to 匹配并且函數沒有被執行過,那么就更新 _invoked 并執行對應的方法。在 default() 里檢查一下 _invoked ,如果從沒執行過,那么就調用 default 分支的函數。
看上去還不錯,我們來試用一下。
switch('cn').case('cn',cn).case('us',us).default(fail) >>> cn switch('us').case('cn',cn).case('us',us).default(fail) >>> cn switch('jp').case('cn',cn).case('us',us).default(fail) >>> fail switch('cn').case('cn',cn).case('us',us) >>> cn
讓我們來看幾個奇葩一點的case。
# duplicate case switch('us').case('us',cn).case('us',us).default(fail) >>> cn def cn() return 'cn' def us() return 'us' # return value result = switch('cn').case('cn',cn).case('us',us) result >>> <python_switch_case.switch object at 0x11034fb70>
發現了沒有,上面的實現不會處理重復的case,當然你可以加強一下case方法,最好是拋出異常,其他編程語言通常都這樣做。
第二個問題,你希望從case里拿到返回值,像上面的寫法是沒希望了,因為扔掉了。我們可以考慮在switch類里加一個result的變量來保存執行結果。
class switch(object): def __init__(self, case_path): ... self.result = None def case(self, key, method): ... self.result = method() ...
在調用結束后,就可以通過 result 拿到結果了。
_ = switch('cn').case('cn',cn).case('us',us) _.result >>> cn
類實現二
我大概在網上搜了一下,你還可以參考 Brian Beck 通過類來實現Swich/Case。
class switch(object): def __init__(self, value): self.value = value self.fall = False def __iter__(self): """Return the match method once, then stop""" yield self.match raise StopIteration def match(self, *args): """Indicate whether or not to enter a case suite""" if self.fall or not args: return True elif self.value in args: self.fall = True return True else: return False c = 'z' for case in switch(c): if case('a'): pass # only necessary if the rest of the suite is empty if case('c'): pass # ... if case('y'): pass if case('z'): print("c is lowercase!") break if case('A'): pass # ... if case('Z'): print("c is uppercase!") break if case(): # default print("I dunno what c was!")
這種實現相對復雜一點,而且用起來也不是很舒服,又需要for又需要if(還不如直接if/else痛快)。當然也有好處,就是可以把相同結果的case放一起,而且case里可以寫更多東西,不僅僅是一個方法名。
寫在最后
最后我們還是回到Python推崇的方法來處理switch/case問題,一般我們可以通過字典來處理這種多分支的問題,舉例說明。
MAPPING = { 'cn': cn, 'us': us } lang = 'cn' result = MAPPING.get(lang, default=us)
是不是一目了然,不僅易于閱讀也易于維護。在字典中key是唯一的,value可以是任意類型的數據,可以是類或者是方法,所以足夠靈活。
下面通過代碼再次學習python語言switch-case
初學python語言,竟然很久才發現python沒有switch-case語句,查看官方文檔說是可以用if-elseif-elseif。。。。代替。
講真,這都不是問題。不就是一個條件判斷嗎。用if-elseif-.......肯定沒問題,同時也用其他的解決方案,比較簡單的就是利用
字典來實現同樣的功能。寫一個字典,每個key對應的值是一個方法。如switch =
{"valueA":functionA,"valueB":functionB,"valueC":functionC}
調用時可以像這樣
try: switch["value"]() #執行相應的方法。 except KeyError as e:
pass 或 functionX #執行default部分
簡單代碼如下:
switch = { "a":lambda x:x*2, "b":lambda x:x*3, "c":lambda x:x**x } try: swtich["c"](6) except KeyError as e: pass
如果不嫌麻煩自己寫一個swtich類來實現也沒問題......不過真有這個必要嗎
總結
以上所述是小編給大家介紹的使用 Python 實現簡單的 switch/case 語句的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。