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抓取网页图片示例(python爬虫)
Apr 27 Python
在Python中操作字典之update()方法的使用
May 22 Python
python 中字典嵌套列表的方法
Jul 03 Python
对python中的iter()函数与next()函数详解
Oct 18 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
Dec 17 Python
Python入门Anaconda和Pycharm的安装和配置详解
Jul 16 Python
使用python快速在局域网内搭建http传输文件服务的方法
Nov 14 Python
解决os.path.isdir() 判断文件夹却返回false的问题
Nov 29 Python
opencv3/C++图像像素操作详解
Dec 10 Python
使用Python 自动生成 Word 文档的教程
Feb 13 Python
Django中使用Json返回数据的实现方法
Jun 03 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
Feb 04 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笔记之:有规律大文件的读取与写入的分析
2013/04/26 PHP
PHP中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
js 屏蔽鼠标右键脚本附破解方法
2009/12/03 Javascript
jquery弹出框的用法示例(一)
2013/08/26 Javascript
JavaScript创建对象的写法
2013/08/29 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
javaScript嗅探执行神器-sniffer.js
2017/02/14 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
vue中使用cookies和crypto-js实现记住密码和加密的方法
2018/10/18 Javascript
使用puppeteer爬取网站并抓出404无效链接
2018/12/20 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
解决tensorflow1.x版本加载saver.restore目录报错的问题
2018/07/26 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
css3一个简易的 LED 数字时钟实现方法
2020/01/15 HTML / CSS
男女时尚与复古风格在线购物:RoseGal(全球免费送货)
2017/07/19 全球购物
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
比利时家具购买网站:Home24
2019/01/03 全球购物
学习委员自我鉴定
2014/01/13 职场文书
酒店拾金不昧表扬信
2014/01/18 职场文书
元旦联欢会主持词
2014/03/26 职场文书
2014幼儿园教师个人工作总结
2014/11/08 职场文书
2015社区健康教育工作总结
2015/05/20 职场文书
对学校的意见和建议
2015/06/04 职场文书
因个人工作失误检讨书
2019/06/21 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP
python中validators库的使用方法详解
2022/09/23 Python