4.2 选择结构

4.2.1 单分支选择结构

单分支选择结构语法如下所示,其中表达式后面的冒号“:”是不可缺少的,表示一个语句块的开始,并且语句块必须做相应的缩进,一般是以4个空格为缩进单位。

    if 表达式:
        语句块

当表达式值为True或其他与True等价的值时,表示条件满足,语句块被执行,否则该语句块不被执行,而是继续执行后面的代码(如果有的话),如图4-1所示。

图4-1 单分支选择结构

例4-1 编写程序,输入使用空格分隔的两个整数,然后按升序输出。

    1.  x = input('Input two numbers:')   #input()函数返回字符串
    2.  a, b = map(int, x.split())        #split()方法使用空格对字符串进行切分
    3.  if a >b:
    4.     a, b = b, a                    #序列解包,交换两个变量的值
    5.  print(a, b)

4.2.2 双分支选择结构

双分支选择结构的语法如下。

    if 表达式:
        语句块1
    else:
        语句块2

当表达式值为True或其他等价值时,执行语句块1,否则执行语句块2。语句块1或语句块2总有一个会执行,然后再执行后面的代码(如果有的话),如图4-2所示。

图4-2 双分支选择结构

例4-2 编写程序,使用双分支结构计算鸡兔同笼问题。

问题描述:鸡兔同笼问题是指已知鸡、兔总数量和腿的总数量,求解鸡、兔各多少只,这实际上是一个二元一次方程组的求解问题。根据数学知识容易知道,二元一次方程组如果有解应该只有唯一解。

基本思路:本例代码模拟的是下面的二元一次方程组求解过程,其中ji表示鸡的数量,tu表示兔子的数量,jitu表示鸡和兔子的总数量,tui表示腿的总数量。

    1.  jitu, tui = map(int, input(’请输入鸡兔总数和腿总数:').split())
    2.  tu = (tui - jitu*2) / 2
    3.  if int(tu) == tu:
    4.      print(’鸡:{0},兔:{1}'.format(int(jitu-tu), int(tu)))
    5.  else:
    6.      print(’数据不正确,无解’)

另外,Python还提供了一个三元运算符,并且在三元运算符构成的表达式中还可以嵌套三元运算符,可以实现与双分支选择结构相似的效果。语法如下。

    value1 if condition else value2

当条件表达式condition的值与True等价时,表达式的值为value1,否则表达式的值为value2。

     > > > a = 5
     > > > print(6 if a >3 else 5)
    6
     > > > b = 6 if a >13 else 9                 #赋值运算符优先级非常低
     > > > b
    9

4.2.3 多分支选择结构

多分支选择结构的语法如下。

    if 表达式1:
        语句块1
    elif 表达式2:
        语句块2
    elif 表达式3:
        语句块3
    ......
    else:
        语句块n

其中,关键字elif是else if的缩写。

例4-3 编写程序,输入一个百分制考试成绩,然后输出对应的等级制成绩,要求使用多分支选择结构。

基本思路:考试成绩的百分制和等级制之间的对应关系为:[90, 100]区间上的分数对应A,[80, 89]区间上的分数对应B,[70, 79]区间上的分数对应C,[60, 69]区间上的分数对应D,小于60分的成绩对应F。

   1.  score = int(input(’请输入一个整数:'))
   2.  if score  > 100 or score < 0:
   3.      print('wrong score.must between 0 and 100.')
   4.  elif score  >= 90:
   5.      print('A')
   6.  elif score  >= 80:
   7.      print('B')
   8.  elif score  >= 70:
   9.      print('C')
  10.  elif score  >= 60:
  11.      print('D')
  12.  else:
  13.      print('F')

4.2.4 选择结构的嵌套

选择结构可以进行嵌套,示例语法如下所示。

    if 表达式1:
        语句块1
        if 表达式2:
            语句块2
        else:
            语句块3
    else:
        if 表达式4:
            语句块4

使用嵌套选择结构时,一定要严格控制好不同级别代码块的缩进量,这决定了不同代码块的从属关系和业务逻辑是否被正确实现,以及代码是否能够被解释器正确理解和执行。

例4-4 编写程序,输入一个百分制考试成绩,然后输出对应的等级制成绩,要求使用嵌套的选择结构。

基本思路:首先检查输入的成绩是否介于0~100,如果是的话再进一步计算其对应的字母等级。

   1.  score = int(input(’请输入一个整数:'))
   2.  degree = 'DCBAAF'                   #[90, 99]区间和100都对应A
   3.  if score  > 100 or score < 0:
   4.      print('wrong score.must between 0 and 100.')
   5.  else:
   6.      index = (score - 60) // 10
   7.      if index  >= 0:                 #这里对应60分以上的成绩
   8.         print(degree[index])
   9.      else:
  10.         print(degree[-1])            #60分以下,对应F