第4章 流程控制语句

2 阅读8分钟

第4章 流程控制语句

流程控制就是用来控制计算机指令的执行顺序。

4.1 顺序

按照程序正常的执行顺序,依次执行每条语句。

4.2 分支

分支流程又叫条件控制语句或者分支语句或者选择语句,是通过条件判断来决定执行的代码。

4.2.1 单分支

1)语法

if 表达式:
    语句

2)说明

Python 程序语言指定任何非 0 和非空(null)值为 true,0 或者 null 为 false。

if 语句的判断条件可以用条件表达式来表示其关系,后面的 : 必须加。其中"判断条件"成立时(非零),则执行后面的语句,而执行内容可以多行,以缩进来区分表示同一范围,缩进取消后,就不在分支范围了。如果条件不成立,不执行语句块内容。

3)案例

商品价格 50,若余额小于 50 则提示"余额不足,请充值",最后打印"欢迎下次光临"。

from random import randint
# 余额
balance = randint(0, 100)
# 价格
price = 50
# 打印余额
print(f"余额:{balance}")
# 比较余额和价格
if balance < price:
    print("余额不足,请充值")
print("欢迎下次光临")

简单的语句组:你也可以在同一行的位置上使用 if 条件判断语句,例如:

var = 100
if (var == 100): print("变量 var 的值为100")
print("Good bye!")

4.2.2 双分支

1)语法

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

2)说明

先进行条件判断,如果条件判断成立就执行语句块 1,条件不成立就执行语句块 2。

3)案例

余额随机,商品价格 50。若余额小于 50 则提示"余额不足,请充值",否则提示消费成功。最后打印"欢迎下次光临"。

from random import randint
# 余额
balance = randint(0, 100)
# 价格
price = 50
# 打印余额
print(f"余额:{balance}")
# 比较余额和价格
if balance < price:
    # 如果余额小于价格
    print("余额不足,请充值")
else:
    # 如果余额大于价格
    balance = balance - price
    print(f"消费成功,余额:{balance}")
print("欢迎下次光临")

4.2.3 多分支

1)语法

if 表达式1:
    语句1
elif 表达式2:
    语句2
elif 表达式3:
    语句3
else:  # else 如不需要可以省略
    语句4

2)说明

if 语句后面可以跟 elif…else 语句,这种语句可以检测到多种可能的情况,所以也称之为多分支结构。

使用多分支语句的时候,需要注意:

  • if 语句至多有 1 个 else 语句,else 语句在所有的 elif 语句之后。
  • if 语句可以有若干个 elif 语句,它们必须在 else 语句之前。
  • 一旦其中一个分支语句检测为 true,其他的 elif 以及 else 语句都将不再执行。

3)案例

判断处于人生哪个阶段:

from random import randint
# 定义年龄并打印
print("此人年龄为", age := randint(0, 100))
if age < 2:
    print("这是个婴儿")
elif age < 4:
    print("这是个幼儿")
elif age < 13:
    print("这是个儿童")
elif age < 20:
    print("这是个青少年")
elif age < 65:
    print("这是个成年人")
else:
    print("这是个老人")

4.2.4 嵌套分支

1)语法

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

2)说明

在一个 if 语句中,又包含另外一个 if 语句,这就是 if 语句的嵌套。

3)案例

给定一个三位的状态码,左边第一位标识大小写状态(1-大写,0-小写),第二位标识输入法语言(1-简体中文,0-英语),第三位标识输入法模式(1-中文,0-英文)。判断输入法的状态:

state = 0b011
# 判断是否为大写状态
if state & 0b100 == 0b100:
    print("大写状态")
else:
    # 判断是否为"简体中文-微软拼音"
    if state & 0b010 == 0b010:
        # 判断是否为"微软拼音-中文"
        if state & 0b001 == 0b001:
            print("微软拼音-中文")
        else:
            print("微软拼音-英文")
    else:
        print("英语-美式键盘")

4.2.5 match case 语句

1)语法

match x:
    case a:
        语句1
    case b:
        语句2
    case _:
        语句3

2)说明

Python 3.10 新增了 match case 的条件判断方式,match 后的对象会依次与 case 后的内容匹配,匹配成功则执行相应语句,否则跳过。其中 _ 可以匹配一切。

3)案例

给定月份,求该月有多少天。| 是专门用于模式匹配的操作符,它能把多个常量或者模式组合起来,实现"或"逻辑。

match month := 3:
    case 1 | 3 | 5 | 7 | 8 | 10 | 12:
        print(f"{month}月有31天")
    case 4 | 6 | 9 | 11:
        print(f"{month}月有30天")
    case 2:
        print(f"{month}月可能有28天")
    case _:
        print(f"{month}月有?天")

4.2.6 三目运算符

1)语法

表达式1 if 判断条件 else 表达式2

2)案例

使用 if 来获取两个数中较大的一个:

num1 = 2
num2 = 3
if num1 > num2:
    max_num = num1
else:
    max_num = num2
print(max_num)

以上代码可以通过三目运算符改写:

num1 = 2
num2 = 3
max_num = num1 if num1 > num2 else num2
print(max_num)

4.3 循环

在满足某个条件下,重复的执行某段代码。

4.3.1 while 循环

1)语法

while 表达式:
    语句-循环体

2)说明

先判断条件是否成立,如果条件成立就执行循环体一次;然后再判断条件是否成立,如果成立,继续执行循环体,直到循环条件不成立的时候,才会结束循环。如果条件表达式一直成立,那称之为无限循环,也叫死循环。

3)案例

(1)第 1 周有 2 只兔子,此后每周兔子的数量都增加上周数量的 2 倍,且期间没有兔子死亡,求第 10 周共有多少只兔子:

rabbit = 2
week = 1
while week < 10:
    rabbit = rabbit + rabbit * 2
    week += 1
    print(f"第{week}周有{rabbit}只兔子")

(2)打印进度条:

import time
num = 1
while num < 100:
    print("\r" + "=" * num, end="")
    num += 1
    time.sleep(0.05)

4)while else 语句

while 后可以加上 else,当 while 表达式结果为 False 时会执行 else 中的语句。

rabbit = 2
week = 1
while week < 10:
    rabbit = rabbit + rabbit * 2
    week += 1
else:
    print(f"第{week}周有{rabbit}只兔子")

此时 else 中代码,写在 else 中和写在循环外效果一样。else 一般和 break 一起使用,循环通过 break 终止后,else 中的代码不会执行。

4.3.2 for 循环

1)语法

for 循环可以用来遍历可迭代对象,如列表或字符串。

for 临时变量 in 可迭代对象:
    语句

for 循环后也可以加上 else,循环结束后会执行 else 中语句。

for 临时变量 in 可迭代对象:
    语句1
else:
    语句2

2)说明

  • for 是关键字
  • 临时变量是自己定义的用来存储遍历出来元素的变量名字
  • in 是关键字
  • 可迭代对象是要遍历的序列
  • 首先判断是否有下一个元素可以获取,如果有,则将元素取出,赋值给临时变量
  • 直到将所有元素都取出,循环结束

3)案例

(1)遍历列表:

for i in [2, 3, 5, 7, 11, 13, 17, 19]:
    print(i)

(2)遍历字符串:

for i in "hello world":
    print(i)

(3)遍历 range 数列:

for i in range(10):
    print(i)

4)range()

  • 作用:函数可以生成数列,它返回一个可迭代对象。
  • 语法range([start,] stop[, step])
    • start:生成序列的起始值(包含),默认 0
    • stop:生成序列的结束值(不包含)
    • step:生成序列的步长,默认为 1
      • 如果为正数:生成的序列是递增的,要求起始值 < 结束值
      • 如果为负数:生成的序列是递减的,要求起始值 > 结束值
for i in range(10):
    print(i)

for i in range(-10, 10):
    print(i)

for i in range(10, -10, -3):
    print(i)

5)嵌套循环

使用嵌套循环打印九九乘法表:

for i in range(1, 10):
    for j in range(1, i + 1):
        print(f"{i} × {j} = {i * j}", end="\t")
    print()

4.3.3 continue

跳过当前循环块中的剩余语句,继续进行下一轮循环。一般写在 if 判断中。

案例:打印 0-9,跳过偶数:

for i in range(10):
    if i % 2 == 0:
        continue
    print(i)

4.3.4 break

跳出当前 for 或 while 的循环体,一般写在 if 判断中。

如果 for 或 while 循环通过 break 终止,循环对应的 else 将不执行。

案例:求 0-9 每个数自己幂自己的加和,如果大于 10000000 则循环终止:

sum = 0
for i in range(10):
    sum = sum + i**i
    if sum > 10000000:
        break
    print(i, sum)
else:
    print("循环完成,sum = ", sum)

4.3.5 pass

pass 是空语句,是为了保持程序结构的完整性。pass 不做任何事情,一般用做占位语句。

例如:在一个循环中,如果循环体为空,语法会提示报错,这个时候我们就可以使用 pass 占位:

for i in range(10):
    pass