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 语句相关推荐
- python中result的用法_关于Python中的列表理解及用法
在Python中,列表理解通常用于编写单行语句,这些语句通过可迭代对象进行迭代以创建新的列表或字典.本文首先介绍for循环如何在Python中工作,然后解释如何在Python中使用列表理解. Pyth ...
- python中content的用法_学python吗,教你5个python现学现用的有趣用法
在我们使用python的过程中也会遇到一些有意思的用法,这里找到了一些总结有趣的 话不多说,接着看下去吧!!!!python高薪就业(视频.学习路线.免费获取)shimo.im for-else用法 ...
- python中主函数用法_【Python 1-13】Python手把手教程之——详解函数和函数的使用...
- 作者 | 弗拉德 来源 | 弗拉德(公众号:fulade_me) 定义函数 下面是一个打印问候语的简单函数,名为greet_user(): def greet_user(): "&quo ...
- python中or的用法_解析python中and与or用法
在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值:而是,返回它们实际进行比较的值之一.>>> 1 and 2 and 3 3 > ...
- python中bool函数用法_在python中bool函数的取值方法
bool是Boolean的缩写,只有真(True)和假(False)两种取值 bool函数只有一个参数,并根据这个参数的值返回真或者假. 1.当对数字使用bool函数时,0返回假(False),任何其 ...
- python中len的用法_总结Python中len()函数的使用实例
这篇文章主要简单介绍了Python中的len()函数的使用,包括在四种情况下的使用小例子,是Python学习当中的基础知识,需要的朋友可以参考下 函数:len() 1:作用:返回字符串.列表.字典.元 ...
- python中object的用法_【Python】【基础知识】【内置函数】【object的使用方法】
原英文帮助文档: classobject Return a new featureless object. object is a base for all classes. It has the m ...
- python中size的用法_在Python中PyArray_SIZE的正确用法是什么?
我是新手操作C中的numpy数组.这里有一段代码让我1)将1-D,64-bit-float numpy数组列表传递给C和2)循环遍历每个数组,打印其内容. #include #include #inc ...
- python中反向切片用法_使用Python中的切片[:0:-1]反转列表
举个例子a = [1, 2, 3, 4, 4, 5, 6, 9] 如果你试着用正指数分割它newa = a[1:5] 这将导致newa = [2, 3, 4, 4] 这是因为,在上面这种情况下,切片是 ...
- python中continue的用法_关于Python中continue用法问题
本人是Python初学者,现在学习到了continue和break的用法,但是为什么自己写这段代码的时候,输入了正确的数字('520')为什么不正确呢??我是想输入正确之后就打破循环打印'游戏结束.. ...
最新文章
- 国内常见的电子地图坐标介绍
- vue打开后端html文件,vue中怎么请求后端数据?
- Springcloud中的region和zone的使用
- dubbo 实践笔记
- Effective Java 电子书 apk版本下载
- (95)分频器设计(偶数分频)
- android 标题栏不显示?
- 2015年计算机维修记录表,2015年 主题教学记录表.doc
- 李飞飞重返祖国执掌Google AI中国团队:不忘初心,中国已觉醒
- 一条拼了40min的hql引发的思考
- qca9377linux无线驱动,ubuntu下安装无线网卡去驱动Qualcomm-Atheros-QCA9377
- STAR原则是什么?
- OBS bit rate推流比特率最佳设置
- LODOP设计打印模板
- python自动化办公:excel篇,从此做表不加班。
- 大数据研发能力模型(面试准备)
- java飞鸽源码_java版本的飞鸽编写(一)
- 从0到1构建大促运营活动
- 淘宝商品销量接口/淘宝商品销量监控接口/商品累计销量接口/商品详情销量接口代码对接分享
- 解决 Xshell 6 | xftp 6 强制更新无法打开
热门文章
- Hadoop 05_MapReduce1.0
- leetcode 622. Design Circular Queue | 641. 设计循环双端队列(Java)
- leetcode 452. Minimum Number of Arrows to Burst Balloons | 452. 用最少数量的箭引爆气球(左程云:最大线段重合问题)
- Spring Boot国际化支持
- 你用或者不用:线程中synchronized关键字使用总结
- MySQL + springboot修改时区的方法小结
- ChubaoFS:一个面向大规模容器平台的分布式文件系统
- 什么是 MultiRaft ?
- 10. 考点概览和摘要
- 通俗易懂两种常用的多线程实现方式——Java并发系列学习笔记