Skip to content

Latest commit

 

History

History
416 lines (323 loc) · 9.07 KB

4.flow_control.md

File metadata and controls

416 lines (323 loc) · 9.07 KB

大多数情况下,Python代码是从上到下逐行解释执行,但是某些场景却不适用于这种顺序结构,比如在射击游戏中,通过输入A、S、D、W四颗方向键来控制精灵(游戏角色)的运动,再比如:求1到100的和,如果要实现上述的需求,那得就用流程控制来实现。在 Python 中有三种控制流语句—— if、for、 和 while 。

if 语句

if语句是分支结构,对应的语境是如果···就···、如果···否则···,表示满足条件就执行。if语句的格式为:

if 逻辑运算值:
    语句
    ...
elif 逻辑运算值:
    语句
    ...
else:
    语句
    ...

语法说明:

  1. if、elif、else是分支语句的关键字,其中,elif和else可省略,elif可有多个;

  2. 逻辑运算值是逻辑运算的结果,简单的可以认为是True或者False;

  3. 缩进,if、elif、else后面必须有冒号( : ),并且其子句必须有相同的缩进;

  4. 分支语句按顺序执行,前面的语句满足时,后面的便不再执行;

案例:

  1. 打招呼,根据当前时间,输出相应的招呼语句:

    # 如果是早上,输出早上好 
    is_morning = True
    if is_morning:
      print('早上好')
    # 判断当前时间,输出早上好或者下午好
    time_now = 'afternoon'
    if time_now == 'morning':
      print('早上好')
    elif time_now == 'afternoon':
      print('下午好')
    # elif 多分支语句
    time_now = 'night'
    if time_now == 'morning':
      print('早上好')
    elif time_now == 'afternoon':
      print('下午好')
    elif time_now == 'night':
      print('晚上好')
    # else语句,前面的判断不满足时执行
    time_now = 'unknow_time'
    if time_now == 'morning':
      print('早上好')
    elif time_now == 'afternoon':
      print('下午好')
    elif time_now == 'night':
      print('晚上好')
    else:
      print('你好')
  2. 简单成绩管理系统,根据输入的成绩,输出优秀([90, 100])、良好([80,90))、中等([60,80))、不及格([0, 60)) :

    score = input('请输入分数:')
    # input输入的值都是字符串,作比较运算,需要将字符串转换为数值型
    score = int(score)
    if score >= 90:
      print('优秀')
    # Python可以使用连续使用运算符,也可以使用:score >= 80 and score < 90
    elif 80 <= score < 90:
      print('良好')
    elif 60 <= score < 80:
      print('中等')
    else:
      print('不及格')
  3. 健康小助手,根据输入的身高体重计算BMI,并输出响应的健康状况,BMI的取值区间如下表所示:

    健康状况 国际BMI值(kg/m2) 国内BMI值(kg/m2)
    偏瘦 <18.5 <18.5
    正常 18.5~25 18.5~24
    过重 25~30 24~28
    肥胖 >=30 >=28
    height = float(input("输入身高(米):"))
    weight = float(input("输入体重(千克):"))
    # 计算 BMI 指数
    bmi = weight / (height * height)
    print('BMI指数为', bmi)
    if bmi < 18.5:
      print("偏瘦")
    elif 18.5 <= bmi < 24:
      print("正常")
    elif 24 <= bmi < 25:
      print("偏胖")
    else:
      print("超胖")

for 语句

for、while语句是循环结构,所谓的循环结构就是将某段代码重复的执行一定的次数,在编程中使用得非常普遍。for循环一般用来执行特定的次数,而while循环用来执行不确定的次数,但是两则基本可以相互转换。

for循环要搭档关键字in一起使用,其语法给是为:

for 变量 in sequence:
    子句
    ...

语法说明:

  1. for···in···是固定的格式,注意冒号和代码缩进;

  2. sequence简单的理解为序列,表示可以重复执行的对象(迭代对象),sequence会将每次循环的临时值赋值给变量;

看看下面的示例:

for i in 'hello,Python':
    print(i)

上面的代码中,hello,Python是一个序列,for循环会根据序列的元素个数(12个元素)计算循环的次数,并将hello,Python的字符逐一赋值给变量i,执行的示意图如下所示:

for循环执行示意图

print()函数默认执行完就换行,所以执行结果为:

h
e
l
l
o
,
P
y
t
h
o
n

range()函数

上一节的示例遍历hello,Python这个序列,但是如果要重复执行一段代码,需要使用range()函数。range()函数用于生成数字序列,用于重复执行一段代码,如下示例:

# 将 "hello, Python" 输出
for i in range(10):
    print('hello, Python')

运行结果:

hello, Python
hello, Python
hello, Python
hello, Python
hello, Python
hello, Python
hello, Python
hello, Python
hello, Python
hello, Python

range()函数生成数字序列:

# 生成数字序列
for i in range(10):
    print(i)

运行结果:

0
1
2
3
4
5
6
7
8
9

range()函数当只有一个参数n时,生成0···n-1 的序列,默认从0开始。假设生成的序列是指定范围,如:5~10,则需要指定两个参数,分别表示序列的开始和结束:

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

运行结果:

5
6
7
8
9

range()函数生成的序列,包括序列的开始,不包括序列的结束。按照数学上的理解,range(start, stop)函数,start是开区间,stop是闭区间,表示为:[start, stop)。

以上的示例生成的序列是连续的,如果要生成规律性的间隔数字序列,可以指定步长(step),示例:

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

运行结果:

0
3
6
9

range()函数的第三个参数用于指定序列的步长,表示元素值的递增幅度(step),所以以上示例生成的序列为:0,0+3,3+3,6+3。step默认为1,不能为0,可以为负数:

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

运行结果:

10
7
4
1

else 子句

for语句可以和else子句配合使用。else语句在for语句循环结束以后执行。示例:

for i in range(10, 0, -3):
    print(i)
else:
    print('运行完毕')

运行结果:

7
4
1
运行完毕

注意:

else语句还可以和break语句结合使用,具体参见下文break章节。

while 语句

while是Python中的另外一种循环结构,主要用于执行不确定次数的循环。while语句的格式为:

while 逻辑运算值:
    子句
    ...

逻辑运算值是逻辑运算的结果,要么为Ture,要么为False。当逻辑运算值为Ture时,while结构执行,当逻辑运算值为False时,while结构终止。示例:

i = 0
while i <= 5:
    print(i)
    i += 1

运行结果:

1
2
3
4
5

特别注意,while结构一定要注意逻辑运算值,避免陷入无限循环。如上述示例中,去掉i += 1这一行,i <= 5衡成立,所以代码则一直运行。

流程控制子句嵌套

流程控制子句嵌套即条件语句或者循环语句可以相互嵌套,直接看示例:

for i in range(1, 6):
    for j in range(1, 6):
        print(j, end=' ')
    print()

运行结果:

1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 
1 2 3 4 5 

break、continue、pass 子句

在某些场景中,需要"打乱"循环结构的执行流程。Python提供了break、continue、pass子句用于改变循环结构的执行流程。

break

break语句用于终止最近的for 或 while循环。示例:

i = 0
while True:
    # 当 i >= 5 时终止循环
    if i >= 5:
        break
    print(i)
    i += 1

运行结果:

0
1
2
3
4

break语句还可以结合for...else语句使用,当循环结构被break终止时,else语句便不会执行,换句话说,break和else语句是互斥关系。示例:

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            break
    else:
        print(n, '是素数')

当break执行时,else语句便不会执行,执行结果:

2 是素数
3 是素数
5 是素数
7 是素数

continue

continue语句表示结束当前循环,继续执行下一次循环。示例:

for num in range(2, 10):
    if num % 2 == 0:
        print("偶数", num)
        continue
    print("奇数", num)

运行结果:

偶数 2
奇数 3
偶数 4
奇数 5
偶数 6
奇数 7
偶数 8
奇数 9

pass

pass语句不执行任何操作,可用于保证语法的完整性,还可以用作函数或条件子句的占位符。例如:

while True:
    pass