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中的decode()方法的使用
May 18 Python
Python设计模式中单例模式的实现及在Tornado中的应用
Mar 02 Python
Python实现定时精度可调节的定时器
Apr 15 Python
5分钟 Pipenv 上手指南
Dec 20 Python
浅析PyTorch中nn.Module的使用
Aug 18 Python
浅谈Django+Gunicorn+Nginx部署之路
Sep 11 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
Sep 23 Python
使用python-cv2实现视频的分解与合成的示例代码
Oct 26 Python
python 通过exifread读取照片信息
Dec 24 Python
flask框架中的cookie和session使用
Jan 31 Python
python 实现mysql自动增删分区的方法
Apr 01 Python
OpenCV-Python实现轮廓拟合
Jun 08 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
php 无法载入mysql扩展
2010/03/12 PHP
PHP 冒泡排序算法的实现代码
2010/08/08 PHP
深入解析fsockopen与pfsockopen的区别
2013/07/05 PHP
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
2013/12/17 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
全面了解JS中的匿名函数
2016/06/29 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
使用百度地图实现地图网格的示例
2018/02/06 Javascript
使用JavaScript中的lodash编写双色球效果
2018/06/24 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
ES6 Class中实现私有属性的一些方法总结
2019/07/08 Javascript
微信小程序swiper禁止用户手动滑动代码实例
2019/08/23 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
[46:09]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第三场
2014/05/26 DOTA
[47:06]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第一局
2016/03/05 DOTA
用Python制作简单的钢琴程序的教程
2015/04/01 Python
Python封装原理与实现方法详解
2018/08/28 Python
python按修改时间顺序排列文件的实例代码
2019/07/25 Python
python flask web服务实现更换默认端口和IP的方法
2019/07/26 Python
python递归下载文件夹下所有文件
2019/08/31 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
Python Flask框架实现简单加法工具过程解析
2020/06/03 Python
python解压zip包中文乱码解决方法
2020/11/27 Python
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
Philosophy美国官网:美国美容品牌
2016/08/15 全球购物
Joie官方网上商店:购买服装和女装配饰
2018/06/05 全球购物
戴尔新加坡官网:Dell Singapore
2020/12/13 全球购物
检讨书模板大全
2015/05/07 职场文书
指导老师鉴定意见
2015/06/05 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS
Java使用HttpClient实现文件下载
2022/08/14 Java/Android