欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

第3章 流程控制语句

程序员文章站 2022-04-09 18:59:45
第3章 流程控制语句 3.1程序的结构 计算机在解决某个具体问题时,主要有3种情况,分别是顺序执行所有的语句、选择执行部分语句和循环执行部分语句。程序设计中的3种基本结构为顺序结构、选择结构和循环结构。这3种结构的执行流程如图所示。 本章之前编写的多数实例采用的都是顺序结构。例如,定义一个字符串类型 ......

第3章 流程控制语句

 3.1程序的结构

计算机在解决某个具体问题时,主要有3种情况,分别是顺序执行所有的语句、选择执行部分语句和循环执行部分语句。程序设计中的3种基本结构为顺序结构、选择结构和循环结构。这3种结构的执行流程如图所示。

第3章 流程控制语句

本章之前编写的多数实例采用的都是顺序结构。例如,定义一个字符串类型的变量,然后输出该变量,代码如下:

第3章 流程控制语句
mot_cn = "命运给予我们的不是失望之酒,而是机会之杯。"    # 使用双引号,字符串内容必须在一行
print(mot_cn)
view code

 

3.2选择语句

python中选择语句主要有3种形式,分别为 if 语句、if...else 语句和 if...elif...else 多分支语句。

3.2.1最简单的if语句

python中使用 if 保留字来组成选择语句,简单的语法格式如下:

 

if 表达式:      #   英文状态下的冒号千万不能丢
    语句块 

 

其中,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式(例如:a>b and a ! = c) ,如果表达式为真,则执行“语句块”;如果表达式的值为假,就跳过“语句块”,继续执行后面的语句,这种形式的 if 语句相当于汉语里的关联词语“如果……就……”。

实例01:判断输入的是不是黄蓉所说的说

第3章 流程控制语句
print("今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?\n")
number = int(input("请输入您认为符合条件的数:"))                # 输入一个数
if number%3 ==2 and number%5 == 3 and number%7 == 2:            # 判断是否符合条件
    print(number,"符合条件:三三数之剩二,五五数之剩三,七七数之剩二")
view code

 

当输入23时,符合条件。

使用 if 语句时,如果在符合条件时,需要执行多个语句,例如,程序的真正意图是当 bmi 的值小于18.5时,才输入 bmi 的值和提示信息“您的体重过轻~@_@~”,正取代码如下:

第3章 流程控制语句
if bmi<18.5:
    print("你的bmi指数为:"+str(bmi))        # 输出bmi指数
    print("你的体重过轻~@_@~")
view code

 

在上面的代码中,如果第二个输出语句没有缩进,代码如下:

if bmi<18.5:
    print("你的bmi指数为:"+str(bmi))        # 输出bmi指数
print("你的体重过轻~@_@~")

 

 在执行程序时,无论bmi的值是否小于18.5,都会输出“您的体重过轻~@_@~”。这显然与程序的本意是不符的,但程序并不会报告异常,因此这种 bug 很难发现。

3.2.2 if...else 语句

python中提供了 if...else 语句解决类似问题,其语法格式如下:

第3章 流程控制语句
if 表达式:
    语句块1
else:
    语句块2
view code

 

使用 if...else 语句时,表达式可以是一个单纯的布尔值或变量,也可以是比较表达式或逻辑表达式,如果满足条件,则执行 if 后面的语句块,否则,执行 else 后面的语句块,这种形式的选择语句相当于汉语里的关联词语“如果……否则……”。

技巧:if...else 语句可以使用条件表达式进行简化,如下面的代码:

第3章 流程控制语句
a = -9
if a > 0:
    b = a
else:
    b = -a
print(b)
view code

 

可以简化成:

第3章 流程控制语句
a = -9
b = a if a>0 else -a
print(b)
view code

 

上段代码主要实现绝对值的功能,如果 a>0 ,就把 a 的值赋值给变量 b ,否则将 -a 赋值给变量 b 。使用条件表达式的好处是可以使代码简洁,并且有一个返回值。

实例02:验证瑛姑给出的答案是否正确

第3章 流程控制语句
print("今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?\n")
number = int(input("请输入您认为符合条件的数:"))                # 输入一个数
if number%3 ==2 and number%5 == 3 and number%7 == 2:            # 判断是否符合条件
    print(number,"符合条件:三三数之剩二,五五数之剩三,七七数之剩二")
else:
    print(number,"不符合条件")
view code

 

运行程序,当输入23时和不是23时……

注意:在使用 else 语句时,else 一定不可以单独使用,它必须和保留字 if 一起使用。

程序中使用 if...else 语句时,如果出现 if 语句多于 else 语句的情况,那么该 else 语句将会根据缩进确定该 else 语句属于哪个 if 语句。如下面的代码:

第3章 流程控制语句
a = -1
if a > 0:
    if a > 0:
        print("a大于0")
    else:
        print("a等于0")
view code

上面的语句将不输出任何提示信息,这是因为else语句属于第3行的if语句,所以当a小于0时,else语句将不执行。而如果将上面的代码修改为以下内容:

第3章 流程控制语句
a = -1
if a > 0:
    if a > 0:
        print("a大于0")
else:
    print("a小于0")
view code

 

将输出提示信息“a小于0”。此时,else语句和第2行的if语句配套使用。

3.2.3if...elif...else语句

 在开发程序时,如果遇到多选一的情况,则可以使用 if...elif...else 语句,该语句是一个多分支选择语句,通常表现为“如果满足某种条件,就会进行某种处理,否则,如果满足另一种条件,则执行另一种处理……”。if...elif...else 语法格式如下:

第3章 流程控制语句
if 表达式1:
    语句块1
elif 表达式2:
    语句块2
elif 表达式3:
    语句块3
...
else:
    语句块n
view code

 

注意:if 和 else 都需要判断表达式的真假,而 else 则不需要判断;另外,elif 和 else 都必须与 if 一起使用,不能单独使用。

实例03:输出玫瑰花语

使用 if...elif...else 多分支语句实现根据用户输入的玫瑰花的朵数输出其代表的含义,代码如下:

第3章 流程控制语句
print("在古希腊神话中,玫瑰集爱情与美丽于一身,所以人们常用玫瑰来表达爱情。")
print("但是不同朵数的玫瑰花代表的含义是不同的。\n")
# 获取用户输入的朵数,并转换位整型
number = int(input("输入您相送几朵玫瑰花,小默会告诉您含义:"))
if number == 1:                     # 判断输入的数是否为1,代表1朵
    # 如果等于1则输出提示信息
    print("1朵:你是我的唯一!")
elif number == 3:                   # 判断是否为3朵
    print("3朵:i love you! ")
elif number == 10:                  # 判断是否为10朵
    print("10朵:十全十美! ")
elif number == 99:                  # 判断是否为99朵
    print("99朵:天长地久! ")
elif number == 108:                 # 判断是否为108朵
    print("108朵:求婚! ")
else:
    print("小默也不知道了!可以考虑位1朵、3朵、10朵、99朵或108朵呦!")
view code

 

说明:第1行代码中的int()函数用于将用户的输入强制转换成整型。

3.2.4 if 语句的嵌套

 前面介绍了3种形式的 if 选择语句,这3种形式的选择语句之间都可以互相嵌套。

在最简单的 if 语句中嵌套 if...else 语句,形式如下:

第3章 流程控制语句
if 表达式1:
    if 表达式2:
        语句块1
    else:
        语句块2
view code

 

在 if...else 语句中嵌套 if...else 语句,形式如下:

第3章 流程控制语句
if 表达式1:
    if 表达式2:
        语句块1
    else:
        语句块2
else:
    if 表达式3:
        语句块3
    else:
        语句块4
view code

 

说明:if 选择语句可以有多种嵌套方式,开发程序时,可以根据自身需要选择合适的嵌套方式,单一定要严格控制好不同级别代码块的缩进量。

模拟场景:国家质量监督检验检疫局发布的《车辆驾驶员血液、呼吸酒精含量阈值也检验》中规定:车辆驾驶人员血液中的酒精含量小于20mg/100l不构成饮酒驾驶行为;酒精含量大于或等于20mg/100l、小于80mg/100l为饮酒驾车;酒精含量大于或等于80mg/100l为醉酒驾车。现编写一段python代码判断是否酒后驾车。

实例04:判断是否为酒后驾车

通过使用嵌套的 if 语句实现根据输入的酒精含量值判断是否为酒后驾车的功能,代码如下:

第3章 流程控制语句
print("\n为了您和他人的安全,严禁酒后开车!\n")
proof = int(input("请输入每100毫升血液的酒精含量:")) # 获取用户输入的酒精含量,并转换为整型
if proof <20:                       # 酒精含量小于20毫克,不构成饮酒行为
    print("\n您还不构成饮酒行为,可以开车,但要注意安全!")
else:                               # 酒精含量大于或等于20毫克,已构成饮酒驾车行为
    if proof <80:                   # 酒精含量小于80毫克,达到饮酒驾驶标准
        print("\n已经达到酒后驾驶标准,请不要开车!")
    else:                           # 酒精含量大于或等于80毫克,已经达到醉酒驾驶标准
        print("\n已经达到醉酒驾驶标准,千万不要开车!")
view code

 

3.3循环语句

日常生活中很多问题都无法一次解决,……类似这样反复做同一件事的情况,称为循环。循环主要有两种类型:

    • 重复一定次数的循环,称为计次循环,如 for 循环。
    • 一直重复,直到条件不满足时才结束的循环,称为条件循环。只要条件为真,这种循环会一直持续下去,如 while 循环。

说明:在其他语言中(例如,c、c++、java等),条件循环还包括 do...while 循环。但是,在python中没有 do...while 循环。

3.4.1 while 循环

while循环是通过一个条件来控制是否要继续反复执行循环中的语句。语法如下:

while 条件表达式:
    循环体

 

说明:循环体是指一组被重复执行的语句。

当条件表达式的返回值为真时,则执行循环体中的语句,执行完毕后,重新判断条件表达式的返回值,直到表达式返回的结果为假时,退出循环。while循环语句的执行流程如图所示。

实例05:助力瑛姑① while循环版解题法

使用while循环语句实现从1开始一次尝试符合条件的数,直到找到符合条件的数时,才退出循环。具体的实现方法是:首先定义一个用于计数的变量number和一个作为循环条件的变量none(默认值为真),然后编写while循环语句,在循环体中,将变量number的值加1,并且判断number的值是否符合条件,当符合条件时,将变量none设置为假,从而推出循环。具体代码如下。

第3章 流程控制语句
print("今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?\n")
none = true                         # 作为循环条件的变量
number = 0                          # 计数的变量
while none:
    number += 1                     # 计数加1
    if number%3 == 2 and number%5 ==3 and number%7 == 2:         # 判断是否符合条件
        print("答曰:这个数是",number)                           # 输出符合条件的数
        none = false                                             # 将循环条件的变量赋值为否
view code

 

注意:在使用while循环语句时,一定不要忘记添加将循环条件改为false的代码,否则,将产生死循环。

3.4.2 for 循环

for循环是一个依次重复执行的循环。通常适用于枚举或遍历序列,以及迭代对象中的元素。语法如下;

for 迭代变量 in 对象、
    循环体

 

其中,迭代变量用于保存读取出的值;对象为要遍历或迭代的对象,该对象可以是任何有序的序列对象,如字符串、列表和元组等;循环体为一组被重复执行的语句。

我们用现实生活中的例子来理解for循环的执行流程。在 体育课上,体育老师要求同学们排队进行踢毽球测试,每个同学一次机会,毽球落地则换另一个同学,直到全部同学都测试完毕,即循环结束。

1.进行数值循环

在使用for循环是,最基本的应用就是进行数值循环。例如,要想实现从1到100的累加,可以通过下面的代码实现:

第3章 流程控制语句
print("计算1+2+3+……+100的结果为:")
result = 0                                  # 保存累加结果的变量
for i in range(101):
    result += i                             # 实现累加功能
print(result)                               # 在循环结束时输入结果
view code

 

在上面的代码中,使用了range()函数,该函数是python内置的函数,用于生成一系列连续的整数,多用于 for 循环语句中。其语法格式如下:

range(start,end,step)

 

参数说明:

  • start:用于指定计数的起始值,可以省略,如果省略则从0开始。
  • end:用于指定计数的结束值(但不包括该值,如range(7),则得到的值为0~6,不包括)7,不能省略。当range()函数中只有一个参数时,即表示指定计数的结束值。
  • step:用于指定步长,即两个数之间的间隔,可以省略,如果省略则表示步长为1。例如,range(1,7)将得到1、2、3、4、5、6。

注意:在使用range()函数中只有一个参数,那么表示指定的是end;如果育两个参数,则表示指定的是start和end;如果3个参数都存在,最后一个参数才表示步长。

例如:使用下面的 for 循环语句,将输出10以内的所有奇数:

for i in range(1,10,2):
    print(i,end = '')

 

得到的结果如下:

13579
>>> 
for i in range(0,10,2):    
    print(i,end = '')    # 打印10以内所有偶数,不包括10

 

下面通过一个具体的实例来演示for循环语句进行数值循环的具体应用。

实例06:助力瑛姑② for 循环版解题法

使用 for 循环语句实现从1循环到100(不包含100),并且记录符合黄蓉要求的数。具体的实现方法是:应用 for 循环语句从1迭代到99,在循环中,判断迭代变量number是否符合“三三数之剩二,五五数之剩三,七七数之剩二”的要求,如果符合则应用print()函数输出,否则继续循环。具体代码如下:

第3章 流程控制语句
print("三三数之剩二,五五数之剩三,七七数之剩二,问几何?\n")
for number in range(100):
    if number%3 ==2 and number%5 ==3 and number%7 ==2:          # 判断是否符合条件
        print("答曰:这个数是",number)                          # 输出符合条件的数
view code

 

2.遍历字符串

使用for循环语句除了可以循环数值,还可以逐个遍历字符串,例如,下面的代码可以将横向显示的字符串转换为纵向显示:

第3章 流程控制语句
string = '不要再说我不能'
print(string)                           # 横向显示
for ch in string:
    print(ch)                           # 纵向显示
view code

 

说明:for循环语句还可以用于迭代(遍历)列表、元组、集合和字典等,具体的方法将在第4章进行介绍。

3.4.3循环嵌套

在python中,允许在一个循环体中嵌入另一个循环,这称为循环嵌套。例如,在电影院找座位号,需要知道第几排第几列才能准确找到自己的座位号,假如寻找第二排第三列座位号,首先寻找第二排,然后在第二排在寻找第三列,这个寻找座位的过程就类似循环嵌套。

在python中,for循环和while循环都可以进行循环嵌套。

例如,在while循环中套用while循环的格式如下:

第3章 流程控制语句
while 条件表达式1:
    while 条件表达式2:
        循环体2
    循环体1
view code

 

在for循环中套用for循环的格式如下:

第3章 流程控制语句
for 迭代变量1 in 对象1:
    for 迭代变量2 in 对象2:
        循环体2
    循环体1
view code

 

在while循环中套用for循环的格式如下:

第3章 流程控制语句
while 条件表达式:
    for 迭代变量 in 对象:
        循环体2
    循环体1
view code

 

在for循环体中套用while循环的格式如下:

第3章 流程控制语句
for 迭代变量 in 对象
    while 条件表达式:
        循环体2
    循环体1
view code

 

除了上面介绍的4种嵌套格式外,还可以实现更多层的嵌套,因为与上面的嵌套方法类似,这里就不再一一列出了。

实例07:打印九九乘法表

第3章 流程控制语句
for i in range(1,10):               # 输出9行
    for j in range(1, i + 1):       # 输出与行数相等的列
        print(str(j) + "×" + str(i) + "=" + str(i * j) + "\t",end='')
    print('')                       # 换行
使用嵌套的for循环打印九九乘法表,代码如下:

 

for i in range(1,10):
    for j in range(1,i+1):
        print("%d*%d=%d"%(j,i,i*j),end="\t")
    print('')

 

代码注解:本实例的代码使用了双层for循环(循环流程如图所示),第一个循环可以看成是对乘法表行数的控制,同时也是每一个乘法公式的第二个因数;第二个循环控制乘法表的列数,列数的最大值应该等于行数,因此第二个循环的条件应该是在第一个循环的基础上建立的。

第3章 流程控制语句

 

3.5跳转语句

当循环条件一直满足时,程序将会一直执行下去,就像一辆迷路的车,在某个地方不停地转圈。如果希望在中间离开循环,也就是for循环结束重复之前,或者while循环找到结束条件之前。有两种方法来做到:

  • 使用continue语句直接跳到循环的下一次迭代。
  • 使用break完全中止循环。

3.5.1 break 语句

break 语句可以终止当前的循环,包括 while 和 for 在内的所有控制语句。break 语句的语法比较简单,只需要在相应的 while 或 for 语句中加入即可。

说明:break 语句一般会结合 if 语句进行搭配使用,表示在某种条件下,跳出循环。如果使用嵌套循环,break 语句将跳出最内层的循环。

在 while 语句中使用 break 语句的形式如下:

第3章 流程控制语句
while 条件表达式1:
    执行代码
    if 条件表达式2:
        break
view code

 

其中,条件表达式 2 用于判断何时调用 break 语句跳出循环。在 while 语句中使用 break 语句的流程如图所示。

……

在 for 语句中使用 break 语句的形式如下:

第3章 流程控制语句
for 迭代变量 in 对象:
    if 条件表达式:
        break
view code

 

其中,条件表达式用于判断何时调用 break 语句跳出循环。在 for 语句中使用 break 语句的流程如图所示。

……

实例08:助力瑛姑③ for 循环改进版解题法

在实例06的最后一行代码下方再添加一个 break 语句,即可以实现找到符合要求的数后直接退出 for 循环。修改后的代码如下:

第3章 流程控制语句
print("今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?\n")
for number in range(100):
    if number%3 ==2 and number%5 == 3 and number%7 == 2:        # 判断是否符合条件
        print("答曰:这个数是",number)                          # 输出符合条件的数   
        break                                                   # 跳出for循环
view code

 

如果想要看出实例 08 和实例 06 的区别,可以在上面滴 02 和 03 行代码之间添加“print(number)”语句输出 number 的值。

3.5.2 continue 语句

continue 语句的作用没有 break 语句强大,它只能终止本次循环而提前进入到下一次循环中。

continue 语句的语法比较简单,只需要在相应的 while 或 for 语句中加入即可。

说明:continue 语句一般会与 if 语句搭配使用,表示在某种条件下,跳过当前循环的剩余语句,然后继续进行下一轮循环。如果使用嵌套循环,continue 语句将只跳过最内层循环中的剩余语句。

在 while 语句中使用 continue 语句的形式如下:

第3章 流程控制语句
while 条件表达式1:
    执行代码
    if 条件表达式2:
        continue
view code

 

其中,条件表达式2 用于判断何时调用continue语句跳出循环。在while语句中使用continue语句的流程如图所示。

在for语句中使用continue语句的形式如下:

第3章 流程控制语句
for 迭代变量 in 对象
    if 条件表达式:
        continue
view code

 

其中,条件表达式用于判断何时调用continue语句跳出循环。

场景模拟:几个好朋友一起玩逢七拍腿游戏,即从1开始依次数数,当数到是7的数或7的倍数时,则不报出该数,而是拍一下腿。现在编写程序,从1数到99,假设每个人都没有出错,计算共要拍多少次推。

实例09:疯逢七拍腿游戏

通过在 for 循环中使用continue语句实现计算拍腿次数,即计算从1到100(不包括100),一共有多少个尾数为7或7的倍数这样的数,代码如下:

第3章 流程控制语句
total = 99                                              # 记录拍腿次数的变量
for number in range(1,100):                             # 创建一个从1到100(不包括100)的循环
    if number % 7 == 0:                                 # 判断是否为7的倍数
        continue                                        # 继续下一次循环
    else:
        string = str(number)                            # 将数值转换为字符串
        if string.endswith('7'):                        # 判断是否以数字7结尾
            continue                                    # 继续下一次循环
    total -= 1                                          # 可拍腿次数-1
print("从1数到99共拍腿",total,"次。")                   # 显示拍腿次数
view code

 

说明:第3行代码实现的是:当所判断的数字是 7 的倍数时,会执行第 4 行的continue语句,跳过后面的减1 操作,直接进入下一次循环;同理,第 7 行代码用于判断是否以数字 7 结尾,如果是,直接进入下一次循环。

3.6 pass 空语句

在python中还有一个pass语句,表示空语句。它不做任何事情,一般起到占位作用。例如,在应用 for 循环输出 1~10 之间(不包括10)的偶数时,在不是偶数,应用pass语句占个位置,为方便以后对不是偶数的进行处理。代码如下:

第3章 流程控制语句
for i in range(1,10):
    if i%2 == 0:                # 判断是否为偶数
        print(i,end = '')
    else:                       # 不是偶数
        pass                    # 占位数,不做任何事情
view code

 

3.7 实战