python没有switch case_为什么Python中没有Switch/Case语句?
不同于我用过的其它编程语言,Python 没有 switch / case 语句。为了实现它,我们可以使用字典映射:
def numbers_to_strings(argument):
switcher = {
0: "zero",
1: "one",
2: "two",
}
return switcher.get(argument, "nothing")
这段代码类似于:
function(argument){
switch(argument) {
case 0:
return "zero";
case 1:
return "one";
case 2:
return "two";
default:
return "nothing";
};
};
Python 代码通常比处理 case 的标准方法更为简短,也可以说它更难理解。当我初次使用 Python 时,感觉很奇怪并且心烦意乱。而随着时间的推移,在 switch 中使用字典的 key 来做标识符变得越来越习以为常。
函数的字典映射
在 Python 中字典映射也可以包含函数或者 lambda 表达式:
def zero():
return "zero"
def one():
return "one"
def numbers_to_functions_to_strings(argument):
switcher = {
0: zero,
1: one,
2: lambda: "two",
}
# Get the function from switcher dictionary
func = switcher.get(argument, lambda: "nothing")
# Execute the function
return func()
虽然 zero 和 one 中的代码很简单,但是很多 Python 程序使用这样的字典映射来调度复杂的流程。
类的调度方法
如果在一个类中,不确定要使用哪种方法,可以用一个调度方法在运行的时候来确定。
class Switcher(object):
def numbers_to_methods_to_strings(self, argument):
"""Dispatch method"""
# prefix the method_name with 'number_' because method names
# cannot begin with an integer.
method_name = 'number_' + str(argument)
# Get the method from 'self'. Default to a lambda.
method = getattr(self, method_name, lambda: "nothing")
# Call the method as we return it
return method()
def number_0(self):
return "zero"
def number_1(self):
return "one"
def number_2(self):
return "two"
很灵活,对吧?
官方说明
官方的解释说,“用if... elif... elif... else序列很容易来实现 switch / case 语句”。而且可以使用函数字典映射和类的调度方法。
可以说官方的说明并没有解释什么,只是给出了解决方案。换句话说,没有回答为什么。我认为其实官方真正想说的是:“Python 不需要 switch / case 语句”。
真的是这样吗?
是的。但是还有别的原因。我听牛人说过,在代码中 switch/case 语句真的很难调试。
就我个人而言,我发现当运行到大量嵌套的用作代码分支映射的字典里,上述说法就站不住脚了。想想吧,一个超过100条语句的嵌套字典,和一个嵌套100个以上 case 的 switch/case 代码块一样,都是难以调试的。
字典映射运行更快?
Python 没有 case 语句,使用其它语言的衡量标准是没有意义的,因为在某种语言中运行更快并不意味着在另一种语言中也一样。让我们继续。
Python 实现方法的显著优点
有时候我会遇到 Python 的实现方法比 switch/case 语句更好用的情况,例如在运行的时候,需要从映射里添加或者删除一些潜在的选项。每当这时,多年来使用字典映射和调度方法的实践让我受益匪浅。现在我觉得,我再也无法回到依赖 switch/case 语句的日子了。
结束语
Python 迫使我积累了很多映射的实践经验,对我来说是塞翁失马,焉知非福。没有 switch/case 语句可用的约束,促使我想到了可能不会用来开发的方法和主意。
有意或无意中,Python 没有 switch/case 语句已成为一种社会建构,并让我成为一个更优秀的程序员。
综上所述,所以我认为这种意外的社会构建解释比官方的“用这个来代替”的说明要好得多。
欢迎关注运维自研堂订阅号,运维自研堂是一个技术分享平台,主要是运维自动化开发:python、django、saltstack、tornado、bootstrap、redis等经验分享。
欢迎加QQ讨论群(474997352)和微信讨论群(若人数达限无法扫码入群,可加我个人微信honglongwei001或扫下面个人微信码加我,备注入群我拉你入群),期待您的入伙。
欢迎大家加入,群内大神较多,只限交流技术,严禁一切广告、闲聊哈,美好的环境需要大家共同维护,谢谢大家配合,小弟在此谢过啦!另,欢迎您拉好友进来,但要告诉您的好友“群规”!我们期待您及您的好友入伙!
python没有switch case_为什么Python中没有Switch/Case语句?相关推荐
- oracle nvarchar2问题,Oracle数据库中,使用case语句,遇到VARCHAR2与NVARCHAR2问题
问题: 在有sqlserver数据库迁移至Oracle数据库时,遇到将VARCHAR2付给NVARCHAR2问题 原sql CASE A .kindCode WHEN '2321034' THEN'0 ...
- access 中相当于 case 语句的函数 switch
access中没有case语句,但是可以使用 switch 函数替代 功能: 对表达式进行判断,并从左到右返回第一个判断表达式结果为 Ture 相对应的值 语法: switch (expr-1, va ...
- php中的select case语句吗,VBS教程:VBScript 语句-Select Case 语句
Select Case 语句 根据表达式的值执行几组语句之一. Select Case testexpression [Case expressionlist-n [statements-n]] . ...
- python switch高效替代_python 中无switch(写了几个函数代替switch)
字典的常用用途之一代替switch 在C/C++/Java语言中,有个很方便的函数switch,比如: 复制代码代码如下: public class test { public static void ...
- 生信分析用python还是r_生信分析中常用的R语句
一.前言 好难受,今天的R崩了.昨天才安装的包怎么报错了.为啥我装了这个包没反应,什么鬼怎么又乱码了.这玩泥巴(╯‵□′)╯︵┻━┻ 不行要佛系生活,好久没写简书了,还是来整理下代码吧┬-┬ノ('-' ...
- php后端switch,详解PHP中php switch的方法实例_后端开发
php+javascript实现用户注册模块(附源码)_后端开发 在任何一个网站内都需要注册功能,本文讲述了利用html . javascript . ajax . php和MySQL实现简单的注册功 ...
- c语言某年某月的天数switch,在C语言中 使用switch语句编写“显示某年某月的天数”程序:...
那就在进入swith语句之前先处理一下,比如先建立两个整形数组预存储闰年和非闰年的每个月的天数,再就是判断一下闰,加上一个判断条件,分入口进入switch语句就可以了. 其实,写程序是"法无 ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-Switch Case语句是否会自动跳转到下一个
在C#中,每一个case后面必须有break,所以输出1,也就是如果a=0,则只会执行case=0的那一段,当等于1之后不会继续. 在TwinCAT中,虽然CASE语句没有break,但是实际上不会在 ...
- sql语句 case_使用SQL Case语句查询数据
sql语句 case The Case statement in SQL is mostly used in a case with equality expressions. The SQL Cas ...
- python中case的用法_用 Python 实现简单的 switch/case 语句
在Python中是没有Switch / Case语句的,很多人认为这种语句不够优雅灵活,在Python中用字典来处理多条件匹配问题字典会更简单高效,对于有一定经验的Python玩家不得不承认,的确如此 ...
最新文章
- 模拟ssh的远程网络传输
- css03层次选择器
- 小学用计算机画画 说课,小学教师说课稿:《画画美丽的自然景色》
- 不同的容器里实现 RadioButton的单选
- 对象androidandroid 开发中 如何取得ListView 的 每条Item 的对象
- 在ie中关于ajax请求获得数据缓存问题的解决办法
- mysql按字段拆分表_MYSQL命令怎么实现将表中某个字段中多个记录拆分,急求答案!...
- mysql安装设置mysql字符集utf8及修改密码
- 圣诞快乐(祝福的话和音乐盒)
- Nginx防止恶意解析-禁止通过IP访问网站
- linux学习笔记:处理linux目录的常用命令
- ubuntu的apt源
- STM8S003F3使用总结——串口
- 如何解决Flash CS6打开后闪退的问题
- BMVC reading list
- 生物信息学最基础知识
- Junit测试运行出现No tests were found
- Mysql设计层优化整理总结
- Android微信授权登录闪退,如何解决微信闪退问题 四种解决微信闪退无法登录的原因及方...
- 华为认证级别有哪些级别分类?考HCIP还是考HCIA?
热门文章
- 2022年第七届IEEE云计算与大数据分析国际会议
- SpringMvc导入Excel
- deprecate node-sass@4.9.0 › request@~2.79.0 request has been deprecated, see https://github.com
- Python2/3的中、英文字符编码与解码输出: UnicodeDecodeError: 'ascii' codec can't decode/encode...
- 如何用css写出一个三角形
- Windows利用系统自带的Dism命令挂载wim文件
- 矩阵分解在推荐系统中的应用及实践
- 华为HCNA实验操作之常用操作命令32-40
- 提升企业网站用户体验 你不可不知的秘诀
- 华为mate7android版本,华为Mate7升级安卓6.0(EMUI4.0)M版本详细图文教程