摘要:類實現一通過以上約束,我們可以把當成一個類來實現,傳入的參數在構造函數里處理,然后再分別實現和方法即可。在構造函數中我們記住了和執行狀態,在里如果當前的和匹配并且函數沒有被執行過,那么就更新并執行對應的方法。
在Python中是沒有Switch / Case語句的,很多人認為這種語句不夠優雅靈活,在Python中用字典來處理多條件匹配問題字典會更簡單高效,對于有一定經驗的Python玩家不得不承認,的確如此。
但今天我們還是來看看如果一定要用Python來Switch / Case,可以怎么玩。
語法約束我們先定義一下Switch/Case應該怎么表達,為了簡單我們可以讓它長成這樣。
def cn(): print("cn") def us(): print("us") switch(lang).case("cn",cn) .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 >>>
發現了沒有,上面的實現不會處理重復的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可以是任意類型的數據,可以是類或者是方法,所以足夠靈活。
關于作者:Toby Qin, Python 技術愛好者,目前從事測試開發相關工作,轉載請注明原文出處。
歡迎關注我的博客 https://betacat.online,你可以到我的公眾號中去當吃瓜群眾。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42451.html
摘要:事實上,凡是能通過邏輯語句來選擇的事物,都可以通過查表來選擇。對簡單的情況而言,使用邏輯語句更為容易和直白。但隨著邏輯鏈的越來越復雜,查表法也就愈發顯得更具吸引力。 優美勝于丑陋import this 博客地址:Specific-Dispatch 前言 表驅動法是一種編輯模式(Scheme)——從表里面查找信息而不使用邏輯語句(if 和 case)。事實上,凡是能通過邏輯語句來選擇...
摘要:給定一個只包括,,,,,的字符串,判斷字符串是否有效。有效字符串需滿足左括號必須用相同類型的右括號閉合。注意空字符串可被認為是有效字符串。 給定一個只包括 (,),{,},[,] 的字符串,判斷字符串是否有效。 Given a string containing just the characters (, ), {, }, [ and ], determine if the inpu...
摘要:中語句用來判斷一個變量與一系列值中某個值是否相等,每個值稱為一個分支。使用包裝類型使用枚舉類型以下為官網的介紹文檔。里面必須跟,不然程序會一個個執行下去,直到最后一個的或者出現。 有粉絲建議可以偶爾推送一些 Java 方面的基礎知識,一方面可以幫助一初學者,也可以兼顧中高級的開發者。 那么今天就講一下 Java 中的 switch case 語句吧,有忘記的同學正好可以溫習一下。 Ja...
摘要:第二步盡量少使用如果在函數中,可以使用,先判斷錯誤條件,然后立馬結束函數,防止進入分支。在大多數情況下,的性能不會比低。 那么問題來了,在js開發中,如何減少if else語句的使用 代碼中嵌套的if/else結構往往導致代碼不美觀,也不易于理解。面向過程的開發中代碼有大量的IF ELSE,在java中可以用一些設計模式替換掉這些邏輯,那么在js中是否也有類似的方法用來盡可能減少代碼中...
摘要:如下所示第一小組銷售額為萬元第二小組銷售額為萬元第三小組銷售額為萬元。 01switch語句解構 * A:switch語句解構 * a:switch只能針對某個表達式的值作出判斷,從而決定程序執行哪一段代碼。 * b:格式如下: swtich(表達式){ case 常量1 : 要執行的...
閱讀 1146·2021-11-23 10:04
閱讀 2406·2021-11-22 15:29
閱讀 2772·2021-11-19 09:40
閱讀 721·2021-09-22 15:26
閱讀 2123·2019-08-29 16:27
閱讀 2490·2019-08-29 16:10
閱讀 1924·2019-08-29 15:43
閱讀 3281·2019-08-29 12:43