Python条件语句详解:if、else、switch都有了( 三 )


下面【例3-4】中的这段代码通过算术运算的符号,获取算术运算表达式 。
【例3-4.py】
1# 使用字典实现switch语句 2from __future__ import division# 导入division模块 3x = 1 4y = 2 5operator = "/" 6result = {         # 定义字典 7"+" : x + y, 8"-" : x - y, 9"*" : x * y,10"/" : x / y 11}12print (result.get(operator))【代码说明】

  • 第3、4行代码定义了两个操作数x、y 。
  • 第5行代码定义了操作符变量operator,该变量用于存放算术运算符 。
  • 第6行代码定义了一个字典result 。该字典的key值由“+”“-”“*”“/”四则运算符组成 。value值由对应的算术表达式组成 。
  • 第12行代码调用get()方法,get()的参数就是变量operator的值 。由于operator的值为“/”,因此将执行除法运算 。输出结果为0.5 。
另一种使用switch分支语句的方案是创建一个switch类,处理程序的流转 。这种实现方法比较复杂,涉及面向对象、for循环、中断语句、遍历等知识,实现步骤分为4步 。
  1. 创建一个switch类,该类继承自Python的祖先类object 。调用构造函数__init__()初始化需要匹配的字符串,并定义两个成员变量value和fall 。value用于存放需要匹配的字符串 。fall用于记录是否匹配成功,初始值为False,表示匹配不成功 。如果匹配成功,程序向后执行 。
  2. 定义一个match()方法,该方法用于匹配case子句 。这里需要考虑3种情况 。首先是匹配成功的情况,其次是匹配失败的默认case子句,最后是case子句中没有使用break中断的情况 。
  3. 重写__iter__()方法,定义了该方法后才能使switch类用于循环语句中 。__iter__()调用match()方法进行匹配,通过yield关键字,使函数可以在循环中迭代 。此外,调用异常StopIteration中断循环 。Python中的循环都是通过异常StopIteration中断的 。这样switch类就构造完成了 。
  4. 编写调用代码,在for…in…循环中使用switch类 。
下面【例3-5】中的这段代码实现了switch语句的功能 。
【例3-5.py】
1class switch(object):# 定义switch类 2    def __init__(self, value):# 初始化需要匹配的值value 3        self.value = value 4        self.fall = False           # 如果匹配到的case语句中没有break,则fall为True 5 6    def __iter__(self):# 定义__iter__()方法 7        yield self.match           # 调用match方法 返回一个生成器 8        raise StopIteration# 用StopIteration 异常来判断for循环是否结束 910    def match(self, *args):   # 模拟case子句的方法11        if self.fall or not args:   # 如果fall为True,则继续执行下面的case子句12                                 # 或case子句没有匹配项,则流转到默认分支13            return True14        elif self.value in args:    # 匹配成功15            self.fall = True16            return True17        else: # 匹配失败18            return False1920operator = "+"21x = 122y = 223for case in switch(operator):  # switch只能用于for... in...循环中24    if case('+'):25        print (x + y)26        break27    if case('-'):28        print (x - y)29        break30    if case('*'):31        print (x * y)32        break33    if case('/'):34        print (x / y)35        break36    if case():               # 默认分支37        print ""


推荐阅读