3 流程控制: 判别式和回圈

判别式: 在程式的运行中, 很多时需要根据不同的情况做相应的运算. 为了处理这些不同的情况, 我们需要把每个情况下应做的操作全部写好. 这些称为程式中的分枝. 中蟒提供了判别式 "如 .. 不然 .. 否则" 来 让程式决定该执行哪一条分枝.

例子:

答 = 整数(输入("请告诉我你的年纪: "))
如 答 == 0:
   写 "别开玩笑了, 你刚出生吗 ?"
不然 答 < 0:
   写 "哇! 妖怪!"
不然 答 > 200:
   写 "哇! 妖怪!"
   写 "不! 是老妖怪!"
不然 答 < 40:
   写 "嘿! 小伙子"
否则:
   相差 = 答 - 1
   写 "你好, 你的年纪比中蟒大", 相差 , '岁.'

"如" 后面要跟着一个判别项, 判别项可以是任何能化简的表达式. 如该表达式为真的话则执行冒号后面的指令.

冒号 ":" 中蟒用来区分判别式的终了, 因此不要忘了加.

注意执行多少行指令是由程式码的缩排来决定的. 也就是说:

如 2 < 1:
  写 "2<1",
写 "当然了"

如 2 < 1:
  写 "2<1",
  写 "当然了"

这两个程式段的结果是不同的. 第二个例子中 '写 "当然了"' 是属于 '如' 的码区中, 所以 '如' 判别失败后该指令不会被执行.

'如' 判别失败后, 程式会继续判别之后的 '不然' 语句. 如有匹配的话则会执行其下的指令. 当所有判别都失败后程式的流程会分枝到 '否则' 之下.

'不然' 和 '否则' 判别式都是可有可无的. 但要注意是判别式中随便一项为真, 则程式执行完其下的指令后会直接跳到整个判别区之下继续运行下面的程式码. 就是说

甲 = 20
如 甲 > 1:
  写 '甲大于 1'
不然 甲 > 2:
  写 '甲大于 2'
不然 甲 > 3:
  写 '甲大于 3'

写 '完成'

这个程式写完 '甲大于 1' 后就直接跳去写 '完成' 了.

判别式容许嵌套形式, 就是说你可以在 '如' 之下的码段中用第二个, 第三个 '如' 语句, 只要你的程式书写依照合理的缩排.

回圈式: 程式有时需要重复执行同一运算许多次. 比如计算从 1 加 到 100 的和, 就要算 100 次加法. 这个情况可利用回圈运算来完成. 中蟒有两类回圈: '取 .. 自 ..' 和 '只要 ..'

和 = 0
循环子 = 0
只要 循环子 < 100:
    和 = 和 + 循环子
    循环子 = 循环子 + 1
写 和

和 = 0
取 循环子 自 范围(0, 100, 1):
    和 = 和 + 循环子
写 和

上面示范了两种方法. 留意上面只是算从 0 加到 99 的值而不是 1 到 100.

第一种结合了判别方式, 程式员需要在回圈中调整 "循环子" 的值. 如果程式中漏了 "循环子 + 1" 这句, 那程式会一直不停地运算下去.

第二种则给出循环范围是从 0 到 100 每次递增 1. 范围是中蟒的内建函数, 它可以产生一个数列.

两种方法都各有长处. '只要' 回圈中循环子的值可以随便更改, 因此可以任意决定何时跳出回圈. '取 ..' 回圈则可以取值自任何序列, 对遍历序列很有用, 如:

取 算子 自 [0, 25, 3, 19, '完']:
   写 算子,

跳出回圈: 中蟒提供了 '下一个' 和 '中断' 两个指令. '下一个' 更新目前回圈的循环子值再重新执行, '中断' 则干脆跳离回圈.

回圈也是可以嵌套的.