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,你可以到我的公众号中去当吃瓜群众。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python没有内置的switch/case语句。与Java、C/C++等语言不同,Python没有直接提供switch/case语句的功能。但是,我们可以通过几种方法来实现类似功能的结构。 第一种方法是使用if...elif...elif...else语句实现类似switch/case的功能。将需要判断的条件依次放在if和elif语句,根据条件执行相应的代码块。最后,可以使用else语句来处理默认情况。虽然这种方法比较简单,但是当分支较多或需要频繁修改时可能不够方便和易于维护。 第二种方法是使用字典来实现类似switch/case的功能。可以将不同的条件作为字典的键,对应的代码块作为字典的值。然后,可以通过检索字典来执行相应的代码块。这种方法非常灵活,可以在运行时方便地添加或删除switch/case选项。 第三种方法是在类使用调度方法来实现类似switch/case的功能。可以将不同的条件作为方法的参数,根据不同的条件执行相应的方法体。这种方法适用于需要在类多次使用相同的条件判断。 综上所述,尽管Python没有直接提供switch/case语句,但可以使用if...elif...elif...else语句、字典或调度方法来实现类似的功能。具体选择哪种方法取决于你的需求和代码结构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python switch/case语句实现方法](https://blog.csdn.net/l460133921/article/details/74892476)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值