与我之前使用的所有语言都不同,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代码的对分支情况的处理方式比switch语句要更加简洁,但是我也可以认为它更晦涩难懂。我刚开始写Python代码的时候,总觉得怪怪的。后来时间长了,使用字典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 语句来处理这些问题”。而且还能使用字典映射到函数,分派到类方法。
令人疑惑的是,官方只给出了替代方案,而并没有解释为什么。换句话说,就是“无可奉告“。在我看来,官方想要表达的意思其实就是”Python不需要case语句“。

真相是什么?
然而我听得最多的说法是,switch/case语句非常难以调试。
但是稍微思考一下就知道这种说法是站不住脚的。只需要假想一下,你使用了一个重重嵌套的巨大字典用来处理分支逻辑;如果这个字典元素超过了100个,那么它的调试难度其实并不低于100个case语句。

或许因为字典映射速度更快?
然并卵,Python没有switch/case语句,没法测试,跳过这一点。

Python这种做法的巨大优势
经验之谈,我经常会碰到一些情景,Python的做法比switch/case语句要优雅有效的多,那就是在我需要在运行时增删映射项的时候。碰到需要这么做的时候,我的Python技能就碉堡了,可以动态的改变字典映射和类方法分派调用。有了这些心得之后,我在也没有怀念过switch/case语句。

最终章
对我而言,使用Python的经验迫使我使用字典映射,而我亦从中因祸得福。没有switch/case语句的苦恼使得我产生了以前没有过的想法、实现了以前没开发过的功能。
总而言之,Python switch/case语句的缺失,使我成为了更好的程序员;而这种开发生态,就是我所期望的比“官方解释”更好的答案

未来CTO关注我CTO之路从此开始微信号:wlaicto

Python | 基础系列 · Python为什么没有switch/case语句?的更多相关文章

  1. python技巧 switch case语句

    不同于C语言和SHELL,python中没有switch case语句,关于为什么没有,官方的解释是这样的 使用Python模拟实现的方法: def switch_if(fun, x, y):    ...

  2. python基础系列教程——Python中的编码问题,中文乱码问题

    python基础系列教程——Python中的编码问题,中文乱码问题 如果不声明编码,则中文会报错,即使是注释也会报错. # -*- coding: UTF-8 -*- 或者 #coding=utf-8 ...

  3. python基础系列教程——Python3.x标准模块库目录

    python基础系列教程——Python3.x标准模块库目录 文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata ...

  4. python基础系列教程——Python库的安装与卸载

    python基础系列教程——Python库的安装与卸载 2.1 Python库的安装 window下python2.python3安装包的方法 2.1.1在线安装 安装好python.设置好环境变量后 ...

  5. python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda

    ---恢复内容开始--- python基础系列教程——Python的安装与测试:python的IDE工具PyDev和pycharm,anaconda 从头开启python的开发环境搭建.安装比较简单, ...

  6. 二十一. Python基础(21)--Python基础(21)

    二十一. Python基础(21)--Python基础(21) 1 ● 类的命名空间 #对于类的静态属性:     #类.属性: 调用的就是类中的属性     #对象.属性: 先从自己的内存空间里找名 ...

  7. JavaScript基础知识(if、if else、else if、while、switch...case语句)

    13.语句 概念:就是分号(:) 代表一条语句的结束 习惯:一行只编写一条语句:一行编写多条语句(代码可读性较差) 语句块:可以包含多条语句     "{ }"将多条语句包裹 u ...

  8. Java基础之循环语句、条件语句、switch case 语句

    Java 循环结构 - for, while 及 do...while 顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构. Java中有三种主要的循环结构: whi ...

  9. JavaSE基础(七)--Java流程控制语句之switch case 语句

    Java switch case 语句 switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. 语法 switch case 语句语法格式如下: switch(exp ...

随机推荐

  1. js字符串 数字 的转换

    js 字符串转化成数字 的 三种方法主要有 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数 ...

  2. 项目知识点.Part1

    1. storyboard中添加scrollview: 先添加scrollView,进行约束 添加View 进行约束 相对于scrollView 如果水平滑动:设置vertically in Cont ...

  3. C#执行oracle返回游标类型的存储过程

    存储过程代码为: create or replace procedure proc_test(pCursor OUT pak_pub.ut_cursor) AS begin -- 使用游标 open ...

  4. codevs 4163 hzwer与逆序对

    传送门 题目描述 Description hzwer在研究逆序对. 对于数列{a},如果有序数对(I,j)满足:i<j,a[i]>a[j],则(i,j)是一对逆序对. 给定一个数列{a}, ...

  5. C++类:private、public、friend、protected的区别

           private和public的作用是让编译器帮你检查某些模块是否使用了他没权限使用的模块,也就是生成可执行代码的时候做权限检查.比如,公司里各个部门有自己私有的信息,财务部可以看所有员工 ...

  6. DB2 SQL RR/RS/CS/UR四个级别《转载》

    1.RR隔离级别:在此隔离级别下, DB2会锁住所有相关的纪录.在一个SQL语句执行期间,所有执行此语句扫描过的纪录都会被加上相应的锁.具体的锁的类型还是由操作的类型来决定,如果是读取,则加共享锁:如 ...

  7. 一篇故事讲述了计算机网络里的基本概念:网关,DHCP,IP寻址,ARP欺骗,路由,DDOS等...

    计算机主机网关的作用是什么? 假设你的名字叫小不点,你住在一个大院子里,你的邻居有很多小伙伴,在门口传达室还有个看大门的李大爷,李大爷就是你的网关.当你想跟院子里的某个小伙伴玩,只要你在院子里大喊一声 ...

  8. 【C++基础之十五】内联函数

    1.优点 为什么使用内联函数,而不使用宏定义,虽然宏本身采用的展开来替代函数调用的压栈出栈返回等操作,提高了代码的效率,但是会有两个问题: (1)边际效应 宏只是展开代码而已,所以在一些操作符的优先级 ...

  9. 分页SQL技术1-COUNT STOPKEY.

    条件有rownum的时候出现 扫描表,到前n行停止

  10. Linux企业级开发技术(6)——libevent企业级开发之内存管理

    默认情况下,libevent使用C库的内存管理函数在堆上分配内存.通过提供malloc.realloc和free的替代函数,可以让libevent使用其他的内存管理器.希望libevent使 用一个更 ...