04. 流程控制
一、流程控制
流程控制就是用来控制程序运行中各语句执行顺序的语句。基本的流程结构为:顺序结构,分支结构(或称选择结构),循环结构。
- 顺序结构:程序自上到下执行,中间没有任何判断和跳转;
- 分支结构:根据条件,选择性的执行某段代码,有 if……else 和 switch……case 两种分支语句;
- 循环结构:根据循环条件,重复性的执行某段代码,有 while、do……while、for 三种循环语句;
二、顺序结构
顺序结构 是 Python 程序默认的执行流程,按照代码的先后顺序,从上到下依次执行,中间没有任何的判断和跳转。
print("你好,世界!")
print("Hello world!")
三、分支结构
选择语句 也被称为 分支语句,它通过给定的条件进行判断,从而决定执行两个或者多个分支中哪一只。因此,在编写选择语句之前,应该首先明确判断条件是什么,并确定判断结果为“真”或“假”时应分别执行什么样的操作/算法。在 Python 语言中提供了if 语句用来实现分支结构。
3.1、if语句的单分支结构
Python 中使用 if 关键字来组成选择语句。
if 关系表达式:
代码块
执行流程:
- 首先计算 关系表达式 的值
- 如果关系表达式的值为 真 就 执行语句体
- 如果关系表达式的值为 假 就 不执行语句体
- 继续执行后面的其它语句
代码块中保存着一组代码,同一个代码块中的代码,要都执行要么都不执行。代码块就是一种为代码分组的机制。代码块以缩进开始,直到代码恢复到之前的缩进级别时结束。
num = int(input("请输入一个数:"))
if num > 10:
print("你输入的数比10大")
print("你输入的数字大于10")
print("你输入的数字是:", num)
使用 if 语句时,如果只有一条语句,语句块可以直接写到 “:” 的右侧。
num = int(input("请输入一个数:"))
if num > 10: print("你输入的数比10大")
print("你输入的数字是:", num)
在 Python 中,if 语句可以使用逻辑运算符来连接多个条件,如果希望所有条件同时满足,则需要使用 and,如果希望只要有一个条件满足即可,则需要使用 or。
num = int(input("请输入一个数:"))
if num < 10 or num > 20:
print("你输入的数不在10和20之间")
print("你输入的数字是:", num)
print()
num = int(input("请输入一个数:"))
if 10 <= num <= 20:
print("你输入的数在10和20之间")
print("你输入的数字是:", num)
Python 对代码的缩进要求非常严格,同一级别的代码块的缩进量必须相同。如果不采用合理的代码缩进,将抛出 SyntaxError 异常;
在 if 结构里面还可以嵌套 if 结构,代码块是可以嵌套的,每增加一个缩进级别,代码块就低一级;
3.2、if语句的双分支结构
if 关系表达式:
代码块1
else:
代码块2
执行流程:
- 首先计算 关系表达式 的值
- 如果关系表达式的值为 真 就执行 语句体 1
- 如果关系表达式的值为 假 就执行 语句体 2
- 继续执行后面的其它语句
num = int(input("请输入一个数:"))
if num > 10:
print("你输入的数比10大")
else:
print("你输入的数不大于10")
print("你输入的数字是:", num)
if..else 语句可以使用关系表达式进行简化。
语句1 if 条件表达式 else 语句2
它的执行流程如下:
- 条件运算符在执行时,会先对条件表达式进行求值判断
- 如果判断结果为 True,则执行语句 1,并返回执行结果
- 如果判断结果为 False,则执行语句 2,并返回执行结果
num = int(input("请输入一个数:"))
print("你输入的数比10大") if num > 10 else print("你输入的数不大于10")
3.3、if语句的多分支结构
if 关系表达式1:
代码块1;
elif 关系表达式2:
代码块2;
……
else:
代码块n+1;
执行流程:
- 首先计算 关系表达式 1 的值
- 如果为 真 就执行 语句体 1;如果为 假 就计算 关系表达式 2 的值
- 如果为 真 就执行 语句体 2;如果为 假 就计算 关系表达式 3 的值
- ……
- 如果 所有的关系表达式 结果都为 假,就执行 else 子句中的 语句体 n+1
- 继续执行其它语句
num = int(input("请输入一个数:"))
if num > 10:
print("你输入的数比10大")
elif num < 10:
print("你输入的数比10小")
else:
print("你输入的数等于10")
else 是一条包罗万象的语句,只要不满足任何 if 和 elif 中的条件测试,其中的代码就会执行。这可能引入无效甚至恶意的数据。如果知道最终要测试的条件,应考虑使用一个 elif 代码块来代替 else 代码块。这样就可以肯定,仅当满足相应的条件时,代码才会执行。
num = int(input("请输入一个数:"))
if num > 10:
print("你输入的数比10大")
elif num < 10:
print("你输入的数比10小")
elif num == 10:
print("你输入的数等于10")
else 结构是可选的;
if-elif-else 结构中最多只会有一个代码块会执行;
如果多个条件表达式之间是“互斥”关系,哪个判断和执行语句声明在上面还是下面,无所谓;
如果多个条件表达式之间有“交集”关系,需根据实际情况,考虑清除应该将哪个结构写在上面;
如果多个条件表达式之间有 “包含”关系,通常情况下,需要 将范围小的声明在范围大的上面。否则,范围小的没机会执行;
四、循环结构
循环就是重复的做某件事情;它具有明确的开始和停止标志;一组被重复执行的语句称之为 循环体,能否继续执行,取决于 循环的终止条件。在 Python 中循环分为 for循环、while循环;循环结构具有以下四个组成部分:
- 初始化部分(init_statement)
- 循环条件部分(test_exp)
- 循环体部分(body_statement)
- 迭代部分(alter_statement)
通常情况下,循环结构都是因为②中循环条件返回false;
4.1、for循环
for 循环时一个计次循环,通常适用于枚举或遍历序列,以及迭代对象中的元素。一般应用在循环对象已知的情况下。
for 迭代变量 in 可迭代对象:
语句块
else:
代码块
其中,迭代变量用于保存读取出的值;对可迭代对象可以是任何有序的序列对象,如列表、元组、字符串等;
执行流程:
- 判断可迭代对象中是否还有项
- 如果 没有,则循环结束,继续执行后面的其它语句
- 如果 有,则 执行循环体语句
- 取 下一项
- 回到 ① 继续执行 条件判断语句
- 如果循环正常结束(即没有被 break 打断的情况下),则执行 else 中的代码块
for element in "Sakura":
print(element,end="")
else:
print("\n循环执行完毕")
print("\n其它语句开始执行")
for 循环还可以和 range() 函数搭配使用,range() 可以用来生成一个自然数的序列,它有三个参数,第一个参数是 起始位置,可以省略,默认是 0,第二个参数是 结束位置,第三个参数是 步长,也可以省略,默认是 1。
for i in range(0,10,2):
print(i)
步长可以为负,用来实现倒计时的效果。
for i in range(5,-1,-1):
print(i)
4.2、while循环
①初始化条件
while ②循环条件:
③循环体
④迭代条件
else:
代码块
执行流程:
- 执行 初始化语句
- 执行 条件判断语句,看其结果是 真 还是 假
- 如果是 假,循环结束,如果循环有 else ,则执行 else 里面的代码块,然后继续执行后面的其它语句
- 如果是 真,执行循环体语句
- 执行 条件控制语句
- 回到②继续执行 条件判断语句
- 如果循环正常结束(即没有被 break 打断的情况下),则执行 else 中的代码块
i = 0
while i < 10:
print(i)
i += 1
else:
print("循环执行完毕")
print("其它语句执行了")
在要求满足很多条件才继续运行的程序中,可定义一个变量,用于判断整个程序是否处于活动状态。这个变量称为 标志(flag),充当程序的交通信号等。可以让程序在标志为 True 时继续运行,并在任何时间导致标志为 False 时让程序停止运行。这样,在 while 语句中就只需检查一个条件:标志的当前值是否为 True。然后将所有测试(是否应将标志设置为 False 的事件)都放在其它地方,从而让程序更整洁。
i = 0
flag = True
while flag:
print(i)
i += 1
if i == 10:
flag = False
else:
print("循环执行完毕")
print("其它语句执行了")
4.4、无限循环
while 循环的无限循环:
while True:
循环体
4.5、嵌套循环
将一个循环结构A声明在另一个循环结构B的循环体,就构成了嵌套循环;
- 外层循环:循环结构B,控制行数
- 内层循环:循环结构A,控制列数
内层结构遍历一遍,相当于外层循环循环体执行一次;假设外层循环需要执行 m 次,内层循环需要执行 n 次。此时内层循环的循环体一共执行了 m*n 次;
i = 1
while i <= 9:
j = 1
while j <= i:
print(j, "*", i,"=", i*j, end="\t")
j += 1
print()
i += 1
4.6、跳转语句
- break:结束当前循环,后面不能直接写执行语句,默认跳出包裹此关键字最近的一层循环;
- continue:结束当次循环,后面不能直接写执行语句,默认结束包裹此关键字最近的循环的一次;
i = 0
while(i < 5):
i += 1
if(i == 3):
break
print("i = ", i)
else:
print("循环结束")
i = 0
while(i < 5):
i += 1
if(i == 3):
continue
print("i = ", i)
else:
print("循环结束")
break 和 continue 语句只能配合循环语句使用,不能单独和 if 使用;
break 和 continue 都是只对离它最近的循环起作用;
五、pass空语句
在 Python 中,还有一个 pass 语句,表示空语句,是为了保持程序结构的完整性。它不做任何事情,一般起到占位的作用。在 Python 3 中,我们可以使用 ... 代替 pass 语句。
# 模块,通过模块可以对Python进行扩展
# 引入一个time模块,来统计程序执行时间
from time import *
# time()函数可以用来获取当前的时间,返回的单位是秒
begin = time()
num = 100000
# 获取num以内的所有质数
i = 2
while i <= num**0.5:
flag = True
j = 2
while j < i:
if i % j == 0:
# 一旦进入判断,则证明i一定不是质数
flag = False
# 此时内循环没有继续执行的必要
# 使用break提前退出循环
break
j += 1
if flag:
pass
# print(i)
i += 1
end = time()
print("花费的时间:", end - begin, "秒")