为什么python没有switch/case

不同于其他编程语言,python中是没有switch/case 这种语法的,如果你是从其他语言转到python的,期初,对于没有switch/case 是很不适应的,不过这并不影响你编程,因为if ... elif ... else 完全可以替代switch/case, 尽管写起来不那么舒服

1. if 条件语句替代 switch/case

def get_score_by_course(course):

"""

根据课程获取考试分数

:param course:

:return:

"""

if course == 'mathematical':

return 90

elif course == 'english':

return 95

elif course == 'history':

return 98

else:

return 0

print(get_score_by_course('english'))

2. 字典替代

除了使用if 条件语句,字典同样可以实现switch/case 的功能

course_dict = {

'mathematical': 90,

'english': 95,

'history': 98

}

def get_score_by_course(course):

"""

根据课程获取考试分数

:param course:

:return:

"""

return course_dict.get(course, 0)

print(get_score_by_course('english'))

使用字典,在课程和分数之间建立起映射关系,获取分数的函数一行代码就实现了if条件语句8行代码的功能,更加的简洁。

使用字典时,还可以用函数做value,使其扩展性更好。

def get_mathematical_score():

return 90

def get_english_score():

return 95

def get_history_score():

return 98

course_dict = {

'mathematical': get_mathematical_score,

'english': get_english_score,

'history': get_history_score

}

def get_score_by_course(course):

"""

根据课程获取考试分数

:param course:

:return:

"""

func = course_dict.get(course, lambda : 0)

return func()

print(get_score_by_course('english'))

3. 通过关键字寻找对应函数

这样的设计,当增加一个课程时,必须修改course_dict,否则将无法获得对应的获取分数的函数,面对这种业务场景,有一种可以免去字典映射的方法,通过globals()函数获得全局变量,然后通过函数名称找到对应的函数

def get_mathematical_score():

return 90

def get_english_score():

return 95

def get_history_score():

return 98

def get_score_by_course(course):

"""

根据课程获取考试分数

:param course:

:return:

"""

global_dict = globals()

func_name = 'get_{course}_score'.format(course=course)

func = global_dict.get(func_name, lambda : 0)

return func()

print(get_score_by_course('history'))

4. 更加直观的映射关系

上面的方法虽然免去了字典映射,看上去简化了代码,但是却带来了新的问题,get_score_by_course函数里的代码总给人一种云里雾里的印象,if条件语句替换switch/case的方法虽然写起来繁琐,但course和处理方法之间的映射关系非常明确,使用字典时,同样可以表达这种明确的映射关系。

而通过关键字直接查找对应的函数这种方式下,course与处理函数之间的映射关系变得隐晦起来,除非你仔细分析代码,否则,很难找到这种映射关系。

我们需要一种无需维护字典,无需繁琐的if 条件语句,同时又能表达清晰简明的映射关系的方法

def func_dispatch(func):

registry = {}

def dispatch(key_word):

return registry.get(key_word, registry[object])

def register(key_word, func=None):

if func is None:

return lambda f: register(key_word, f)

registry[key_word] = func

return func

def wrapper(*args, **kw):

return dispatch(args[0])(*args, **kw)

registry[object] = func

wrapper.register = register

return wrapper

@func_dispatch

def score_dispath(course):

return 0

@score_dispath.register('mathematical')

def get_mathematical_score(course):

return 90

@score_dispath.register('english')

def get_english_score(course):

return 95

@score_dispath.register('history')

def get_history_score(course):

return 98

def get_score_by_course(course):

"""

根据课程获取考试分数

:param course:

:return:

"""

return score_dispath(course)

print(get_score_by_course('mathematical'))

func_dispatch 是一个装饰器,先用这个装饰器去装饰score_dispath,score_dispath就变成了可以分发函数的路由器,由它再去装饰实际处理业务的函数,注册的过程建立起关键字和函数之间的映射关系,这样,既没有if条件语句的繁琐,也没有维护字典的琐碎,却保留了映射关系的明确,至于这个func_dispatch装饰器,你实在理解不了也没有关系,只要会使用就可以了,使用时要注意,那些被注册的业务函数的参数必须和score_dispath保持一致,此外,你不需要再处理额外的事情。

python中有没有switch_为什么python没有switch/case相关推荐

  1. 设python中有模块m_关于 Python 命令中的 -m 参数(转帖)

    2020-04-20 13:45 在命令行中使用 Python 时,它可以接收大约 20 个选项(option),语法格式如下: python [-bBdEhiIOqsSuvVWx?] [-c com ...

  2. Python小炼(1):初识Python

    "也许对我来说,太多拘束可能" 本篇的主要内容,针对的是一些常见的语法,在python中是怎样表示的,例如,python变量如何定义.选择.循环.判断结构是如何表示的?python ...

  3. 有了 elseif 为什么还要 switch case

    引出 你有没有想过既然有了if elseif, 为什么还要设计一个switch case的语法出来呢? 按理说, 一个语言的设计角度来说, 关键词越少越好吧, 而且多出来一种选择分支也没有看出太大用处 ...

  4. python中有没有switch_Python为什么没有switch/case语句?

    与我之前使用的所有语言都不同,Python没有switch/case语句.为了达到这种分支语句的效果,一般方法是使用字典映射: def numbers_to_strings(argument): sw ...

  5. python中一共有多少个关键字-Python中有几个关键字

    Python中关键词有多少个?Python中关键词目前有31个,可以利用Python的内置的keyword模块进行输出查看. keyword模块 Help on module keyword: NAM ...

  6. Python中有了列表,为什么还有元组?

    Python中有一个基础的数据结构,叫做元组(tuple),但是一般挺少有人会去用它的,因为在开发过程中,列表(list)基本已经能够满足我们的需求. 即使是这样,你也千万不要就此认为元组是多余的.不 ...

  7. 【Python面试】 说说Python中有几种数据类型?​

    往期面试题: 谈谈对 Python 和其他语言的区别? 说说 Python 解释器种类以及特点? 说说4种常用编码的区别? 说说Python面向对象三大特性? 废话不多说,开始今天的题目: 问:说说 ...

  8. python中case的用法_python中Switch/Case实现的示例代码

    python 的 python中Switch/Case实现的示例代码 学习Python过程中,发现没有switch-case,过去写C习惯用Switch/Case语句,官方文档说通过if-elif实现 ...

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

    在Python中是没有Switch / Case语句的,很多人认为这种语句不够优雅灵活,在Python中用字典来处理多条件匹配问题字典会更简单高效,对于有一定经验的Python玩家不得不承认,的确如此 ...

最新文章

  1. gprs发送信号对方如何接收_和接收缓冲区比较:Netty发送缓冲区是如何设计的,why?...
  2. Android之安装常见的一些解决方法
  3. Windows 任务管理器中的几个内存概念
  4. 关于AppCompatDelegate的使用
  5. md3600i存储服务器连接 iscsi+multipath配置
  6. <学习日记>计算机网络第一章预习记录
  7. 【树链剖分】旅游(luogu 3976)
  8. Sql Server数据库备份和恢复:原理篇
  9. iOS6,7,8,9新特性汇总
  10. 程序员常常会用到的几款文本编辑器
  11. dropout为什么有效
  12. 每周全球科技十大新闻(2021.2.1-2.7)
  13. wps居中对齐不在中间_如何解决wps表格居中调整
  14. 企业级自动化运维工具Ansible详解(上)
  15. qemu与宿主机网络通信配置
  16. Excel中鲜为人知的“照相机”功能(收藏)
  17. 如何提取视频中的音频?自用方法介绍
  18. 中国知名食品品牌策划包装设计,哪家实力最强
  19. 在这冷漠的世界里光光哭哭
  20. 【恭喜考研拟录取】极力推荐科研必备软件,让你科研生涯事半功倍(3万字超全总结-码住系列)

热门文章

  1. 利用python爬取甲骨文图片及其对应的汉字含义,共1062个甲骨文,百度云下载
  2. 2015.2,对任意正整数n,求xn,要求运算时间复杂度为o(logn).例如x30=x15*x15.
  3. 榆熙电商:为何购物旗舰店选择优于其他?
  4. 决策力--用别人预测自己(3)
  5. 杨家将杨业四子杨延辉子嗣传人世代居住松滋
  6. 聊聊强AI——来到治愈系空间的小茶末
  7. android+属性动画+高度,android 自定义view+属性动画实现充电进度条
  8. 透视城市“生命线” MapGIS地下管线三维建模工具
  9. 电力监控系统在嘉兴万豪酒店的设计与应用
  10. App 启动流程与 Activity 启动流程梳理