拓展:switch实现

参考中谷教育 python视频:switch

 switch语句用于编写多分支结构的程序,类似于if ... elif ...else语句。
switch语句表达的分支结构比if...elif...else语句表达的更清晰,代码的可读性更高
但是,python并没有提供switch语句 !!
python可以通过字典实现switch语句的功能,实现方法分为两步:
——首先定义一个字典。
——其次,调用字典里的get()获取响应的表达式。
 
通过字典调用函数:
{1:case1,2:case2}.get(x,lambda *arg,**key:)()       这语句比较难理解。通过例子来说明:

简单的计算器:
用if语句判断加减乘除

 
#计算器至少涉及4种运算,+ - * /
#引入一个模块,解决运算的数据类型问题
 
from __future__ import division
 
def jia(x,y):
    return(x + y)
 
def jian(x,y):
    return(x - y)
 
def cheng(x,y):
    return(x * y)
 
def chu(x,y):
    return(x / y)
 
def operator(x,o,y):
    if o == '+':
        print(jia(x,y))
    elif o == '-':
        print(jian(x,y))
    elif o == '*':
        print(cheng(x,y))
    elif o == '/':
        print(chu(x,y))
    else:
        pass
    
operator(2,'/',4)
 如果进行除法运算,先得判断是否加,减,乘之后再判断 除,实际上前三次判断是多余的。并不是直接根据我们给的符号进行运算,而是做了几次判断后才运算,如果符号不是加减乘除范围内,那么代码会做四次判断,结果才到pass
switch实现是类似于这样:我们事先把四个条件摆在这里,当你传回来的值符合哪个条件的时候直接执行就可以了

from __future__ import division
 
def jia(x,y):
    return(x + y)
#jia = lambda x,y : x + y 
def jian(x,y):
    return(x - y)
#jian = lambda x,y : x - y
 
def cheng(x,y):
    return(x * y)
# cheng = lambda x,y : x * y
 
def chu(x,y):
    return(x / y)
#chu = lambda x,y : x / y
 
#定义一个字典
operator = {'+' : jia, '-' : jian,'*' : cheng, '/' : chu}
#(operator['+'](3,2)) 等同于 jia(3,2)
#取字典里的值用get()
print(operator['/'](3,2))
这里省去了if的判断环节,只是把值告诉字典,然后去取值做运算。 也可以增加一个函数:

from __future__ import division
 
jia = lambda x,y : x + y 
jian = lambda x,y : x - y
cheng = lambda x,y : x * y
chu = lambda x,y : x / y
 
#定义一个字典
operator = {'+' : jia, '-' : jian,'*' : cheng, '/' : chu}
#(operator['+'](3,2)) 等同于 jia(3,2)
#print(operator['/'](3,2))
#取字典里的值用get()
def f(x,o,y):
    print(operator.get(o)(x,y))
    
f(3,'/',2)
 当然按照{1:case1,2:case2}.get(x,lambda *arg,**key:)() 这个形式,还可以改为:

from __future__ import division
 
jia = lambda x,y : x + y 
jian = lambda x,y : x - y
cheng = lambda x,y : x * y
chu = lambda x,y : x / y
 
def f(x,o,y):
    print({'+' : jia, '-' : jian,'*' : cheng, '/' : chu}.get(o)(x,y))
    
f(3,'/',2)
 当然当然,还可以简化为这样:

from __future__ import division
x = 3
y = 2
operator = '/'
result = {
          '+' : x + y,
          '-' : x - y,
          '*' : x * y,
          '/' : x / y
          }
print(result.get(operator))
 当然当然当然当然,还可以这样简化:

from __future__ import division
 
def f(x,o,y):
    print({'+' : x+y, '-' : x-y,'*' : x*y, '/' : x/y}.get(o))
    
f(3,'/',2)

拓展:switch实现的更多相关文章

  1. C#NPOI对Excel的操作、导入导出时异常处理、最全的NPOI资料在这里~

    一.Excel理论知识 最新版NPOI2.4.1链接:https://pan.baidu.com/s/1iTgJi2hGsRQHyw2S_4dIUw  提取码:adnq • 整个Excel表格叫做工作 ...

  2. 据说每个大牛、小牛都应该有自己的库——JavaScript原生对象拓展

    在据说每个大牛.小牛都应该有自己的库——框架篇中我扬言要做个小牛,没想到一天没更新,小伙儿伴们就戏谑的问我,油哥是不是要太监了?其实事情是这个样子的,这不是太监的节奏,一是,关于写个自己的库的想法由来 ...

  3. 9.12/ css3拓展、js基础语法、程序基本知识、数据类型、运算符表达方式、语句知识点

    css3拓展: <display:none>  将某个元素隐藏       <visibility:hidden>  也是将某个元素隐藏 <display:block&g ...

  4. ListBox复选框拓展

    Toolkit的LongListMutiSelector的复选框功能,想必许多人都需要吧!然而系统本身控件ListBox虽然也有多选功能,可是外观上却缺乏复选框,选择效果只是颜色变化.于是在上一个项目 ...

  5. 学习Swift -- 拓展

    拓展(Extension) 扩展就是向一个已有的类.结构体.枚举类型或者协议类型添加新功能.这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模).扩展和 Objective-C 中的分类 ...

  6. android ListView和GridView拖拽移位具体实现及拓展

    关于ListView拖拽移动位置,想必大家并不陌生,比较不错的软件都用到如此功能了.如:搜狐,网易,百度等,但是相比来说还是百度的用户体验较好,不偏心了,下面看几个示例:              首 ...

  7. 单片微机原理P3:80C51外部拓展系统

    外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC.   0. IO接口电路概念与存储器拓展 1. 为什 ...

  8. JavaScript原生对象拓展

    JavaScript原生对象拓展 在据说每个大牛.小牛都应该有自己的库——框架篇中我扬言要做个小牛,没想到一天没更新,小伙儿伴们就戏谑的问我,油哥是不是要太监了?其实事情是这个样子的,这不是太监的节奏 ...

  9. 框架基础:ajax设计方案(六)--- 全局配置、请求格式拓展和优化、请求二进制类型、浏览器错误搜集以及npm打包发布

    距离上一次博客大概好多好多时间了,感觉再不搞点东西出来,感觉就废了的感觉.这段时间回老家学习驾照,修养,然后7月底来上海求职(面了4家,拿了3家office),然后入职同程旅游,项目赶进度等等一系列的 ...

随机推荐

  1. Mechanism of Loading Resources

    Mechanism of Loading Resources 1. Distributed strategy 1.1. Developer guilde 1.2. Notes 2. Centraliz ...

  2. IIS 之 查看并发连接数

    如果要查看IIS连接数,最简单方便的方法是通过“网站统计”来查看,“网站统计”的当前在线人数可以认为是当前IIS连接数.然而,“网站统计”的当前在线人数统计时间较长,一般为10分钟或15分钟,再加上统 ...

  3. Arcengine10下载地址

    ed2k://|file|%5BArcGIS.Engine.Developer.kit.10.%E8%8B%B1%E6%96%87%E7%89%88%5D.ArcGIS.Engine.Develope ...

  4. OC中-方法到底是如何使用的?

    方法:方法是Objective-C独有的一种结构,只能在Objective-C中声明.定义和使用,C语言不能声明.定义和使用. 1.类方法以+号开头,对象方法以-号开头+ (void) init;  ...

  5. 基于动态库的C++插件开发模型

    基类为抽象类,在不同的动态库中实现不同的执行行为,但是每个动态库要提供2个统一的方法:1) baseClass * create(); 2) void destroy( baseClass* );,调 ...

  6. [转]oracle的ANYDATA数据类型

    本文转自:http://blog.csdn.net/yuzhenhuan01/article/details/6606106 ANYDATA数据类型是个有点奇特的类型,你可以把不同数据类型的数据通过转 ...

  7. 关于XML的DTD概述

    1 DTD概述 1.1 什么是DTD DTD(Document Type Definition),文档类型定义,用来约束XML文档.或者可以把DTD理解为创建XML文档的结构!例如可以用DTD要求XM ...

  8. Python函数中参数* 和 ** 的区别

    * 函数接收参数为元组 例如 def myfun(*args): #相当于 def myfun(1,2,3)    ==> args 就相当于(1,2,3) for a in args: pri ...

  9. PHP之数组函数归类

    数组之所以强大,除了本身声明.存储方式灵活,它还有坚强后盾:一系列功能各异的数组处理函数.就像一只军队,除了领队将军本身能征善战,指挥英明之外,还有一群不怕死.忠实于他的士兵,这样才能显得整体的强大. ...

  10. jsp(一) : servlet基础

    1.客户  servlet容器   servlet 2.实现接口     #1.接口:servlet :             constrontor .init().service.destroy ...