日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python中case的用法_用 Python 实现简单的 switch/case 语句

發布時間:2024/1/23 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python中case的用法_用 Python 实现简单的 switch/case 语句 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在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,你可以到我的公眾號中去當吃瓜群眾。

總結

以上是生活随笔為你收集整理的python中case的用法_用 Python 实现简单的 switch/case 语句的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。