欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年09月17日 10:47:02   作者:Tech  
這篇文章主要介紹了用 Python 實現(xiàn)簡單的 switch/case 語句的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

在Python中是沒有Switch / Case語句的,很多人認為這種語句不夠優(yōu)雅靈活,在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)

類實現(xiàn)一

通過以上約束,我們可以把switch當成一個類來實現(xiàn),傳入的參數(shù)在構造函數(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()

在構造函數(shù)中我們記住了 case_path 和執(zhí)行狀態(tài) _invoked ,在 case() 里如果當前的 key 和 switch_to 匹配并且函數(shù)沒有被執(zhí)行過,那么就更新 _invoked 并執(zhí)行對應的方法。在 default() 里檢查一下 _invoked ,如果從沒執(zhí)行過,那么就調用 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
>>> <python_switch_case.switch object at 0x11034fb70>

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

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

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

類實現(xiàn)二

我大概在網上搜了一下,你還可以參考 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)相對復雜一點,而且用起來也不是很舒服,又需要for又需要if(還不如直接if/else痛快)。當然也有好處,就是可以把相同結果的case放一起,而且case里可以寫更多東西,不僅僅是一個方法名。

寫在最后

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

MAPPING = {
  'cn': cn,
  'us': us
}
lang = 'cn'
result = MAPPING.get(lang, default=us)

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

下面通過代碼再次學習python語言switch-case

 初學python語言,竟然很久才發(fā)現(xiàn)python沒有switch-case語句,查看官方文檔說是可以用if-elseif-elseif。。。。代替。

講真,這都不是問題。不就是一個條件判斷嗎。用if-elseif-.......肯定沒問題,同時也用其他的解決方案,比較簡單的就是利用

字典來實現(xiàn)同樣的功能。寫一個字典,每個key對應的值是一個方法。如switch =

{"valueA":functionA,"valueB":functionB,"valueC":functionC}

調用時可以像這樣

try:
  switch["value"]() #執(zhí)行相應的方法。
except KeyError as e:

  pass 或 functionX #執(zhí)行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類來實現(xiàn)也沒問題......不過真有這個必要嗎

總結

以上所述是小編給大家介紹的使用 Python 實現(xiàn)簡單的 switch/case 語句的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

  • 分析python垃圾回收機制原理

    分析python垃圾回收機制原理

    這篇文章主要介紹了python垃圾回收機制原理,python采用的是引用計數(shù)機制為主,標記-清除和分代收集兩種機制為輔的策略,有需要的的朋友可以借鑒參考想
    2021-09-09
  • python 中的collections.OrderedDict() 用法

    python 中的collections.OrderedDict() 用法

    這篇文章主要介紹了python 中的collections.OrderedDict() 用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Pandas DataFrame轉換為字典的方法

    Pandas DataFrame轉換為字典的方法

    實際開發(fā)中我們可能會遇到一類問題,如何將Pandas DataFrame轉換為字典,本文就來介紹一下,感興趣的可以了解一下
    2021-05-05
  • Python爬取成語接龍類網站

    Python爬取成語接龍類網站

    在本篇文章里我們給大家分享了關于Python爬取成語接龍類網站的相關知識點,有需要的朋友們學習下。
    2018-10-10
  • 對Python _取log的幾種方式小結

    對Python _取log的幾種方式小結

    今天小編就為大家分享一篇對Python _取log的幾種方式小結,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python數(shù)據(jù)類型詳解(四)字典:dict

    Python數(shù)據(jù)類型詳解(四)字典:dict

    本文給大家分享的知識是Python數(shù)據(jù)類型中的字典(dict)的基本概念,常用操作以及示例,非常的實用,對于大家理解字典dict非常有幫助,希望大家能夠喜歡
    2016-05-05
  • 使用Python項目生成所有依賴包的清單方式

    使用Python項目生成所有依賴包的清單方式

    這篇文章主要介紹了使用Python項目生成所有依賴包的清單方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python多線程學習資料

    Python多線程學習資料

    Python中使用線程有兩種方式:函數(shù)或者用類來包裝線程對象
    2012-12-12
  • Python采集某度貼吧排行榜實戰(zhàn)示例

    Python采集某度貼吧排行榜實戰(zhàn)示例

    這篇文章主要為大家介紹了Python采集某度貼吧排行榜實戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 利用python設計圖像加密技術(Arnold算法)

    利用python設計圖像加密技術(Arnold算法)

    這篇文章主要介紹了利用python設計圖像加密技術(Arnold算法),本文將借助Arnold置亂法,講解如何用python從頭至尾設計出一套圖像加密算法,需要的小伙伴可以才參考一下
    2022-03-03

最新評論