成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

用 Python 實現(xiàn)簡單的 switch/case 語句

王偉廷 / 1954人閱讀

摘要:類實現(xiàn)一通過以上約束,我們可以把當(dāng)成一個類來實現(xiàn),傳入的參數(shù)在構(gòu)造函數(shù)里處理,然后再分別實現(xiàn)和方法即可。在構(gòu)造函數(shù)中我們記住了和執(zhí)行狀態(tài),在里如果當(dāng)前的和匹配并且函數(shù)沒有被執(zhí)行過,那么就更新并執(zhí)行對應(yīng)的方法。

在Python中是沒有Switch / Case語句的,很多人認為這種語句不夠優(yōu)雅靈活,在Python中用字典來處理多條件匹配問題字典會更簡單高效,對于有一定經(jīng)驗的Python玩家不得不承認,的確如此。

但今天我們還是來看看如果一定要用Python來Switch / Case,可以怎么玩。

語法約束

我們先定義一下Switch/Case應(yīng)該怎么表達,為了簡單我們可以讓它長成這樣。

def cn():
    print("cn")

def us():
    print("us")

switch(lang).case("cn",cn)
            .case("us",us)
               .default(us)
類實現(xiàn)一

通過以上約束,我們可以把switch當(dāng)成一個類來實現(xiàn),傳入的參數(shù)在構(gòu)造函數(shù)里處理,然后再分別實現(xiàn)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()

在構(gòu)造函數(shù)中我們記住了case_path 和執(zhí)行狀態(tài)_invoked,在case()里如果當(dāng)前的keyswitch_to匹配并且函數(shù)沒有被執(zhí)行過,那么就更新_invoked并執(zhí)行對應(yīng)的方法。在default()里檢查一下_invoked,如果從沒執(zhí)行過,那么就調(diào)用default分支的函數(shù)。

看上去還不錯,我們來試用一下。

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
>>> 

發(fā)現(xiàn)了沒有,上面的實現(xiàn)不會處理重復(fù)的case,當(dāng)然你可以加強一下case方法,最好是拋出異常,其他編程語言通常都這樣做。

第二個問題,你希望從case里拿到返回值,像上面的寫法是沒希望了,因為扔掉了。我們可以考慮在switch類里加一個result的變量來保存執(zhí)行結(jié)果。

class switch(object):
    def __init__(self, case_path):
        ...
        self.result = None

    def case(self, key, method):
        ...
        self.result = method()
    ...

在調(diào)用結(jié)束后,就可以通過result拿到結(jié)果了。

_ = switch("cn").case("cn",cn).case("us",us)
_.result
>>> cn
類實現(xiàn)二

我大概在網(wǎng)上搜了一下,你還可以參考Brian Beck通過類來實現(xiàn)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!")

這種實現(xiàn)相對復(fù)雜一點,而且用起來也不是很舒服,又需要for又需要if(還不如直接if/else痛快)。當(dāng)然也有好處,就是可以把相同結(jié)果的case放一起,而且case里可以寫更多東西,不僅僅是一個方法名。

寫在最后

最后我們還是回到Python推崇的方法來處理switch/case問題,一般我們可以通過字典來處理這種多分支的問題,舉例說明。

MAPPING = {
    "cn": cn,
    "us": us
}

lang = "cn"
result = MAPPING.get(lang, default=us)

是不是一目了然,不僅易于閱讀也易于維護。在字典中key是唯一的,value可以是任意類型的數(shù)據(jù),可以是類或者是方法,所以足夠靈活。

關(guān)于作者:

Toby Qin, Python 技術(shù)愛好者,目前從事測試開發(fā)相關(guān)工作,轉(zhuǎn)載請注明原文出處。

歡迎關(guān)注我的博客 https://betacat.online,你可以到我的公眾號中去當(dāng)吃瓜群眾。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42451.html

相關(guān)文章

  • Python Switch Case 最佳實踐

    摘要:事實上,凡是能通過邏輯語句來選擇的事物,都可以通過查表來選擇。對簡單的情況而言,使用邏輯語句更為容易和直白。但隨著邏輯鏈的越來越復(fù)雜,查表法也就愈發(fā)顯得更具吸引力。 優(yōu)美勝于丑陋import this 博客地址:Specific-Dispatch 前言 表驅(qū)動法是一種編輯模式(Scheme)——從表里面查找信息而不使用邏輯語句(if 和 case)。事實上,凡是能通過邏輯語句來選擇...

    sorra 評論0 收藏0
  • LeetCode 20:有效括號 Valid Parentheses

    摘要:給定一個只包括,,,,,的字符串,判斷字符串是否有效。有效字符串需滿足左括號必須用相同類型的右括號閉合。注意空字符串可被認為是有效字符串。 給定一個只包括 (,),{,},[,] 的字符串,判斷字符串是否有效。 Given a string containing just the characters (, ), {, }, [ and ], determine if the inpu...

    TesterHome 評論0 收藏0
  • switch case 支持 6 種數(shù)據(jù)類型!

    摘要:中語句用來判斷一個變量與一系列值中某個值是否相等,每個值稱為一個分支。使用包裝類型使用枚舉類型以下為官網(wǎng)的介紹文檔。里面必須跟,不然程序會一個個執(zhí)行下去,直到最后一個的或者出現(xiàn)。 有粉絲建議可以偶爾推送一些 Java 方面的基礎(chǔ)知識,一方面可以幫助一初學(xué)者,也可以兼顧中高級的開發(fā)者。 那么今天就講一下 Java 中的 switch case 語句吧,有忘記的同學(xué)正好可以溫習(xí)一下。 Ja...

    hss01248 評論0 收藏0
  • 在js開發(fā)中,如何減少if else語句使

    摘要:第二步盡量少使用如果在函數(shù)中,可以使用,先判斷錯誤條件,然后立馬結(jié)束函數(shù),防止進入分支。在大多數(shù)情況下,的性能不會比低。 那么問題來了,在js開發(fā)中,如何減少if else語句的使用 代碼中嵌套的if/else結(jié)構(gòu)往往導(dǎo)致代碼不美觀,也不易于理解。面向過程的開發(fā)中代碼有大量的IF ELSE,在java中可以用一些設(shè)計模式替換掉這些邏輯,那么在js中是否也有類似的方法用來盡可能減少代碼中...

    android_c 評論0 收藏0
  • 1、流程控制語句switch 2、數(shù)組 3、隨機點名器案例

    摘要:如下所示第一小組銷售額為萬元第二小組銷售額為萬元第三小組銷售額為萬元。 01switch語句解構(gòu) * A:switch語句解構(gòu) * a:switch只能針對某個表達式的值作出判斷,從而決定程序執(zhí)行哪一段代碼。 * b:格式如下: swtich(表達式){ case 常量1 : 要執(zhí)行的...

    余學(xué)文 評論0 收藏0

發(fā)表評論

0條評論

王偉廷

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<