python中Switch/Case实现的示例代码


Posted in Python onNovember 09, 2017

学习Python过程中,发现没有switch-case,过去写C习惯用Switch/Case语句,官方文档说通过if-elif实现。所以不妨自己来实现Switch/Case功能。

使用if…elif…elif…else 实现switch/case

可以使用if…elif…elif..else序列来代替switch/case语句,这是大家最容易想到的办法。但是随着分支的增多和修改的频繁,这种代替方式并不很好调试和维护。

方法一

通过字典实现

def foo(var):
  return {
      'a': 1,
      'b': 2,
      'c': 3,
  }.get(var,'error')  #'error'为默认返回值,可自设置

方法二

通过匿名函数实现

def foo(var,x):
  return {
      'a': lambda x: x+1,
      'b': lambda x: x+2,
      'c': lambda x: x+3, 
  }[var](x)

方法三

通过定义类实现

参考Brian Beck通过类来实现Swich-case

# This class provides the functionality we want. You only need to look at
# this if you want to know how this works. It only needs to be defined
# once, no need to muck around with its internals.
class switch(object):
  def __init__(self, value):
    self.value = value
    self.fall = False

  def __iter__(self):
    """Return the match method once, then stop"""
    yield self.match
    raise StopIteration

  def match(self, *args):
    """Indicate whether or not to enter a case suite"""
    if self.fall or not args:
      return True
    elif self.value in args: # changed for v1.5, see below
      self.fall = True
      return True
    else:
      return False


# The following example is pretty much the exact use-case of a dictionary,
# but is included for its simplicity. Note that you can include statements
# in each suite.
v = 'ten'
for case in switch(v):
  if case('one'):
    print 1
    break
  if case('two'):
    print 2
    break
  if case('ten'):
    print 10
    break
  if case('eleven'):
    print 11
    break
  if case(): # default, could also just omit condition or 'if True'
    print "something else!"
    # No need to break here, it'll stop anyway

# break is used here to look as much like the real thing as possible, but
# elif is generally just as good and more concise.

# Empty suites are considered syntax errors, so intentional fall-throughs
# should contain 'pass'
c = 'z'
for case in switch(c):
  if case('a'): pass # only necessary if the rest of the suite is empty
  if case('b'): pass
  # ...
  if case('y'): pass
  if case('z'):
    print "c is lowercase!"
    break
  if case('A'): pass
  # ...
  if case('Z'):
    print "c is uppercase!"
    break
  if case(): # default
    print "I dunno what c was!"

# As suggested by Pierre Quentel, you can even expand upon the
# functionality of the classic 'case' statement by matching multiple
# cases in a single shot. This greatly benefits operations such as the
# uppercase/lowercase example above:
import string
c = 'A'
for case in switch(c):
  if case(*string.lowercase): # note the * for unpacking as arguments
    print "c is lowercase!"
    break
  if case(*string.uppercase):
    print "c is uppercase!"
    break
  if case('!', '?', '.'): # normal argument passing style also applies
    print "c is a sentence terminator!"
    break
  if case(): # default
    print "I dunno what c was!"

# Since Pierre's suggestion is backward-compatible with the original recipe,
# I have made the necessary modification to allow for the above usage.

查看Python官方:PEP 3103-A Switch/Case Statement

发现其实实现Switch Case需要被判断的变量是可哈希的和可比较的,这与Python倡导的灵活性有冲突。在实现上,优化不好做,可能到最后最差的情况汇编出来跟If Else组是一样的。所以Python没有支持。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Hadoop中的Python框架的使用指南
Apr 22 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
Jul 30 Python
python 将md5转为16字节的方法
May 29 Python
Python实现的简单排列组合算法示例
Jul 04 Python
Python 编程速成(推荐)
Apr 15 Python
Python Opencv实现图像轮廓识别功能
Mar 23 Python
python实现视频分帧效果
May 31 Python
Python实现EXCEL表格的排序功能示例
Jun 25 Python
Django CBV类的用法详解
Jul 26 Python
django ModelForm修改显示缩略图 imagefield类型的实例
Jul 28 Python
如何在Django配置文件里配置session链接
Aug 06 Python
python 网络编程要点总结
Jun 18 Python
在Python web中实现验证码图片代码分享
Nov 09 #Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
Nov 09 #Python
Python3.6 Schedule模块定时任务(实例讲解)
Nov 09 #Python
Python中scatter函数参数及用法详解
Nov 08 #Python
python实现人脸识别代码
Nov 08 #Python
python生成随机图形验证码详解
Nov 08 #Python
Python爬虫实例爬取网站搞笑段子
Nov 08 #Python
You might like
追忆往昔!浅谈收音机的百年发展历史
2021/03/01 无线电
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
PHP用户注册邮件激活账户的实现代码
2017/05/31 PHP
PHP实现上传图片到数据库并显示输出的方法
2018/05/31 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
jQuery中size()方法用法实例
2014/12/27 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
2016/08/02 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
200行代码实现blockchain 区块链实例详解
2018/03/14 Javascript
layui 对table中的数据进行转义的实例
2019/09/12 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
vue祖孙组件之间的数据传递案例
2020/12/07 Vue.js
[42:32]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.27
2020/12/01 DOTA
Python 面向对象 成员的访问约束
2008/12/23 Python
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
pyenv命令管理多个Python版本
2017/03/26 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
如何利用pygame实现简单的五子棋游戏
2019/12/29 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
Sofmap官网:日本著名的数码电器专卖店
2017/05/19 全球购物
耐克中国官方商城:Nike中国
2018/10/18 全球购物
韩国演唱会订票网站:StubHub韩国
2019/01/17 全球购物
高中美术教学反思
2014/01/19 职场文书
计算机学生的自我评价分享
2014/02/18 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
教师调动申请报告
2015/05/18 职场文书
红十字会救护培训简讯
2015/07/20 职场文书
升学宴来宾致辞
2015/07/27 职场文书
python - asyncio异步编程
2021/04/06 Python
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL
SSM VUE Axios详解
2021/10/05 Vue.js
MySQL三种方式实现递归查询
2022/04/18 MySQL