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 相关文章推荐
Python的randrange()方法使用教程
May 15 Python
Python实现在线音乐播放器
Mar 03 Python
Python sqlite3事务处理方法实例分析
Jun 19 Python
Python实现公历(阳历)转农历(阴历)的方法示例
Aug 22 Python
Python函数返回不定数量的值方法
Jan 22 Python
python内存管理机制原理详解
Aug 12 Python
Python 单例设计模式用法实例分析
Sep 23 Python
解决pycharm上的jupyter notebook端口被占用问题
Dec 17 Python
Elasticsearch py客户端库安装及使用方法解析
Sep 14 Python
Python基于Webhook实现github自动化部署
Nov 28 Python
python解包概念及实例
Feb 17 Python
OpenCV-Python直方图均衡化实现图像去雾
Jun 07 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
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
php常用的url处理函数总结
2014/11/19 PHP
php在线解压ZIP文件的方法
2014/12/30 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
JS中showModalDialog 的使用解析
2013/04/17 Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
2014/06/12 Javascript
JS控制弹出新页面窗口位置和大小的方法
2015/03/02 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
2015/09/16 Javascript
Vue和Bootstrap的整合思路详解
2017/06/30 Javascript
JS数组操作之增删改查的简单实现
2017/08/21 Javascript
基于vue-element组件实现音乐播放器功能
2018/05/06 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
使用Python编写一个模仿CPU工作的程序
2015/04/16 Python
详解python中asyncio模块
2018/03/03 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
Python中turtle库的使用实例
2019/09/09 Python
如何利用Python动态模拟太阳系运转
2020/09/04 Python
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
分厂厂长岗位职责
2013/12/29 职场文书
员工拓展培训方案
2014/02/15 职场文书
决心书范文
2014/03/11 职场文书
设备售后服务承诺书
2014/05/30 职场文书
实习计划书范文
2015/01/16 职场文书
感恩的心主题班会
2015/08/12 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
css3新特性的应用示例分析
2022/03/16 HTML / CSS
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技