不同于我用过的其它编程语言,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语句?相关推荐

  1. oracle nvarchar2问题,Oracle数据库中,使用case语句,遇到VARCHAR2与NVARCHAR2问题

    问题: 在有sqlserver数据库迁移至Oracle数据库时,遇到将VARCHAR2付给NVARCHAR2问题 原sql CASE A .kindCode WHEN '2321034' THEN'0 ...

  2. access 中相当于 case 语句的函数 switch

    access中没有case语句,但是可以使用 switch 函数替代 功能: 对表达式进行判断,并从左到右返回第一个判断表达式结果为 Ture 相对应的值 语法: switch (expr-1, va ...

  3. php中的select case语句吗,VBS教程:VBScript 语句-Select Case 语句

    Select Case 语句 根据表达式的值执行几组语句之一. Select Case testexpression [Case expressionlist-n [statements-n]] . ...

  4. python switch高效替代_python 中无switch(写了几个函数代替switch)

    字典的常用用途之一代替switch 在C/C++/Java语言中,有个很方便的函数switch,比如: 复制代码代码如下: public class test { public static void ...

  5. 生信分析用python还是r_生信分析中常用的R语句

    一.前言 好难受,今天的R崩了.昨天才安装的包怎么报错了.为啥我装了这个包没反应,什么鬼怎么又乱码了.这玩泥巴(╯‵□′)╯︵┻━┻ 不行要佛系生活,好久没写简书了,还是来整理下代码吧┬-┬ノ('-' ...

  6. php后端switch,详解PHP中php switch的方法实例_后端开发

    php+javascript实现用户注册模块(附源码)_后端开发 在任何一个网站内都需要注册功能,本文讲述了利用html . javascript . ajax . php和MySQL实现简单的注册功 ...

  7. c语言某年某月的天数switch,在C语言中 使用switch语句编写“显示某年某月的天数”程序:...

    那就在进入swith语句之前先处理一下,比如先建立两个整形数组预存储闰年和非闰年的每个月的天数,再就是判断一下闰,加上一个判断条件,分入口进入switch语句就可以了. 其实,写程序是"法无 ...

  8. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-Switch Case语句是否会自动跳转到下一个

    在C#中,每一个case后面必须有break,所以输出1,也就是如果a=0,则只会执行case=0的那一段,当等于1之后不会继续. 在TwinCAT中,虽然CASE语句没有break,但是实际上不会在 ...

  9. sql语句 case_使用SQL Case语句查询数据

    sql语句 case The Case statement in SQL is mostly used in a case with equality expressions. The SQL Cas ...

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

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

最新文章

  1. 模拟ssh的远程网络传输
  2. css03层次选择器
  3. 小学用计算机画画 说课,小学教师说课稿:《画画美丽的自然景色》
  4. 不同的容器里实现 RadioButton的单选
  5. 对象androidandroid 开发中 如何取得ListView 的 每条Item 的对象
  6. 在ie中关于ajax请求获得数据缓存问题的解决办法
  7. mysql按字段拆分表_MYSQL命令怎么实现将表中某个字段中多个记录拆分,急求答案!...
  8. mysql安装设置mysql字符集utf8及修改密码
  9. 圣诞快乐(祝福的话和音乐盒)
  10. Nginx防止恶意解析-禁止通过IP访问网站
  11. linux学习笔记:处理linux目录的常用命令
  12. ubuntu的apt源
  13. STM8S003F3使用总结——串口
  14. 如何解决Flash CS6打开后闪退的问题
  15. BMVC reading list
  16. 生物信息学最基础知识
  17. Junit测试运行出现No tests were found
  18. Mysql设计层优化整理总结
  19. Android微信授权登录闪退,如何解决微信闪退问题 四种解决微信闪退无法登录的原因及方...
  20. 华为认证级别有哪些级别分类?考HCIP还是考HCIA?

热门文章

  1. 2022年第七届IEEE云计算与大数据分析国际会议
  2. SpringMvc导入Excel
  3. deprecate node-sass@4.9.0 › request@~2.79.0 request has been deprecated, see https://github.com
  4. Python2/3的中、英文字符编码与解码输出: UnicodeDecodeError: 'ascii' codec can't decode/encode...
  5. 如何用css写出一个三角形
  6. Windows利用系统自带的Dism命令挂载wim文件
  7. 矩阵分解在推荐系统中的应用及实践
  8. 华为HCNA实验操作之常用操作命令32-40
  9. 提升企业网站用户体验 你不可不知的秘诀
  10. 华为mate7android版本,华为Mate7升级安卓6.0(EMUI4.0)M版本详细图文教程