零基础学Python——第二章 基础语法(四)流程控制语句

第四节 流程控制语句

一、代码执行顺序

代码的执行顺序通常是按照从上到下的书写顺序依次运行。但在某些情况下,会根据条件判断或循环结构改变执行顺序。这种改变通过流程控制语句实现。

所有程序都可以归结为三种基本控制结构:

  • 顺序结构:代码从上到下依次执行。
  • 条件结构:根据条件判断,选择性地执行某些代码。
  • 循环结构:重复执行某段代码,直到满足某个条件为止。

这三种结构是编程的基础。无论程序多么复杂,都可以通过组合它们来实现。

在前面的示例中,代码是一句接着一句书写的,执行时也是从上到下依次进行。这就是顺序结构的特点。

为了实现条件结构和循环结构,Python 提供了具体的工具,称为条件语句循环语句。接下来将详细解释条件语句和循环语句。

二、条件语句
什么是条件语句

日常生活中,经常会根据条件判断决定下一步行动。例如,如果天气晴朗就去公园,否则待在家里。

在代码中,通过判断一个表达式的结果(真或假)来决定下一步操作。上面的例子在 Python 中类似这样:

if 天气晴朗:
    去公园
else:
    待在家里
条件语句的格式与示例

条件语句的格式如下:

if 条件1:
    语句1
elif 条件2:
    语句2
else:
    默认语句

说明:

  1. 条件是一个结果为 TrueFalse 的布尔表达式。
  2. 使用 if 判断第一个条件,如果满足条件就执行语句块1。if 是条件语句的必要部分。
  3. 如果第一个条件不成立,可以使用 elif 判断其他条件。elif 可以省略,也可以有多个。
  4. 如果所有条件都不成立,可以使用 else 处理默认情况。else 可以省略,但建议保留作为兜底逻辑。
  5. 每个条件后面需要用冒号(:)结束,对应的代码块需要缩进一级。

根据判断条件的数量,条件语句有以下几种形式:

  • 只处理符合条件的一种情况:只要符合条件就执行 if 条件 语句块中的代码,否则不执行任何操作。

    a = 12
    if a > 0:
        print("a 大于 0,a =", a)  # 输出:a 大于 0,a = 12
    
  • 处理互相排斥的两种情况:如果符合条件就执行 if 条件 语句块中的代码,否则执行 else 语句块中的代码。

    a = -12
    if a > 0:
        print("a 大于 0,a =", a)
    else:
        print("a 小于等于 0,a =", a)  # 输出:a 小于等于 0,a = -12
    
  • 处理互相排斥的多种情况:符合条件1就执行 if 条件1 语句块中的代码,符合条件2就执行 elif 条件2 语句块中的代码,依此类推。如果不符合任何条件,就执行 else 语句块中的代码。

    a = 0
    if a > 0:
        print("a 大于 0,a =", a)
    elif a < 0:
        print("a 小于 0,a =", a)
    else:
        print("a 等于 0,a =", a)  # 输出:a 等于 0,a = 0
    
  • 复杂的条件判断:复杂条件由多个条件组成,可以通过组合、嵌套或合理安排判断顺序来处理。

    示例:假设 a 是一个数字,如果 a 是正数则加3,如果是两位正数则加5,如果是负数则减3,如果 a=0 则保持不变。

    def test_if_1():
        print("\n方式一:合理安排条件的判断顺序...")
        a = 12
        if a >= 10 and a < 100:  # a 是两位正数
            a += 5
            print("a 是两位正数, 加5,新值 a =", a)
        elif a > 0:  # a 是正数但不是两位数
            a += 3
            print("a 是正数但不是两位数, 加3,新值 a =", a)
        elif a < 0:  # a 是负数
            a -= 3
            print("a 是负数, 减3,新值 a =", a)
        else:  # a 等于 0
            print("a 等于 0,保持不变")
    
  • 复杂的条件判断

    复杂条件一般由多个条件组成,这些条件看起来好像还不是完全互相排斥的多种情况,其实通过组合、嵌套这些判断条件或合理安排这些条件的判断顺序就可以来判断这些复杂的条件。

    示例:假设 a 是一个数字,如果 a 是正数则加3,如果是两位正数则加5,如果是负数则减3,如果 a=0 则保持不变。

    这里从易到难用三种方法来实现这个问题:

    • 方式一:合理安排条件的判断顺序,通常把要求最苛刻和条件放到前面,代码如下:

      def test_if_1():
          print("\n方式一:合理安排条件的判断顺序...")
          a = 12
          if a >= 10 and a <= 99:     # 先判断比较苛刻的条件:a是两位数
              a += 5
              print("a是两位正数, 加5,新值 a = ", a)
          elif a > 0:                 # 再判断比较宽松的条件:a是正数
              a += 3
              print("a是正数但不是两位数, 加3,新值 a = ", a)
          elif a < 0:                 # 再判断比较宽松的条件:a是负数
              a -= 3
              print("a是负数, 减3,新值 a = ", a)
          else:                       # 最后判断最宽松的条件:a是0
              pass    # 不执行任何操作
              print("a是0,保持不变,新值 a = ", a)
      

      注意不要漏掉某个判断条件,以下方法可以有效减少代码的错误:

      • 事前避免:对于复杂的判断条件,可以根据问题的要求画出程序的流程图来分析判断条件。

        流程图是一种图形化的工具,用于描述程序的逻辑结构和执行路径。它通过使用标准化的符号和箭头来表示程序的各个步骤以及它们之间的关系。流程图可以帮助开发者更直观地理解程序的运行逻辑,尤其适合初学者学习和分析代码。

        流程图的基本元素:

        1. 椭圆形:表示程序的开始结束
        2. 矩形:表示一个操作处理步骤
        3. 菱形:表示一个条件判断 ,菱形通常有两个出口:一个是“是”(True),另一个是“否”(False)。
        4. **箭头:**表示程序的执行方向或流程,箭头连接不同的图形,展示程序的逻辑顺序。

        下面给出上面方法一的流程图:

        Yes
        No
        Yes
        No
        Yes
        No
        开 始
        a 是两位数?
        加5并打印新值
        a 是正数?
        加3并打印新值
        a 是负数?
        减3并打印新值
        保持不变并打印
        结 束
      • 事后测试:根据问题的要求输入符合各种条件的数据,可以输入每种条件下的边界值或特殊值等正确数据,还要输入不符合条件的错误数据。

        比如,可以令a分别取以下值来测试代码的正确性:

        正确数据:0(特殊值),1(边界值),9(边界值),10(边界值),37,99(边界值),100(边界值), 1000,-1(边界值),-1000

        错误数据:这个题目没有不符合要求的错误数据。

    • 方式二:组合判断多个条件, 也就是用关系比较运算符和逻辑运算符把多个条件组合成一个表达式,根据这个表达式的计算结果(TrueFalse)来决定代码的执行情况,注意运算的优先级,如果不清楚就使用括号来明确优先级,代码如下:

      def test_if_2():
          print("\n方式二:组合判断多个条件...")
          a = 12
          if a > 0 and (a >= 10 and a <= 99):     # a>0 并且 a是两位正数
              a += 5
              print("a是两位正数, 加5,新值 a = ", a)
          elif a > 0 and (a < 10 or a > 99):      # a>0 并且 a不是两位数
              a += 3
              print("a是正数但不是两位数, 加3,新值 a = ", a)
          elif a < 0: # a<0
              a -= 3
              print("a是负数, 减3,新值 a = ", a)
          else:       # a==0
              pass  # 不执行任何操作
              print("a是0,保持不变,新值 a = ", a)
      
    • 方式三:嵌套判断多个条件,在条件语句中嵌套条件语句,可以嵌套多层,通常把较苛刻的条件客在内层,注意缩进级别,内层语句要使用Tab键缩进一级,代码示例如下:

      def test_if_3():
          print("\n方式三:嵌套判断多个条件...")
          a = 12
          if a > 0:   # 外层判断条件, a>0
              if a >= 10 and a <= 99:  # 内层判断条件,增加一级缩进,a是两位数
                  a += 5
                  print("a是两位正数, 加5,新值 a = ", a)
              else:                    # 内层判断条件,增加一级缩进,a不是两位数
                  a += 3
                  print("a是正数但不是两位数, 加3,新值 a = ", a)
          elif a < 0: # 外层判断条件, a<0  
              a -= 3
              print("a是负数, 减3,新值 a= ", a)
          else:       # 外层判断条件, a==0
              pass    # 不执行任何操作
              print("a是0,保持不变,新值 a = ", a)
      

条件语句的几点补充
  • 缩进:Python对缩进非常敏感,每个语句块相对if/elif/else语句要缩进一级,每个语句块内部的语句块缩进要保持一致,以下是错误示例:

    if 条件表达式1:
        print("语句块1")
      print("语句块1的一部分")  # 缩进不一致,会导致语法错误
    
  • 空语句ifelifelse的语句块不能省略,否则会产生语法错误,如果暂时没有执行语句,可以写一条空语句pass来占位,建议明确注释为什么该语句块为空,或者直接移除不必要的条件,例如:

    if 条件表达式1:
        pass  # 空语句块,明确注释为什么该语句块为空。 
    

三、循环语句
什么是循环语句

有时,我们会处理一些重复执行多次操作的任务,这些任务的特点是途程的绝大多数条件是相同的,只有极少数条件是变化的,便这些变化往往又是遵循一定的规律(如随时间或数量变化的条件)。

在代码中,当需要重复执行某段代码,多次完成相同任务时,使用循环语句,这样可以大大提高效率。

例如,打印数字1到10,不需要写10次打印命令,而是通过循环来实现,上面的示例在Python中类似这样:

打印次数 = 1
whle 打印次数 <= 10 :
	打印数据
    打印数据 += 1

循环语句的格式与示例

循环语句用于重复执行一段代码,直到满足某个条件为止。常见的循环语句包括 forwhile

  • for 循环:用于遍历一组数据中的每个元素,并对每个元素执行某些操作。

    for 变量 in 可迭代对象:
        循环体
    

    相关概念:

    • 遍历:按照某种顺序访问一组数据中的每个元素的过程。
    • 可遍历对象:可以通过某种机制逐一访问其内部元素的对象,比如列表、字符串、元组、字典、集合和 range 对象等。
  • 遍历字符串:打印字符串中的每个字符。

    def test_for_1():
        print("\n使用 for 循环...")
        print("打印字符串中的每个字符...")
        s = "Hello World!"
        for c in s:  # 遍历字符串 s,依次打印 s 中的字符
            print(c, end=" ")  # 输出:H e l l o   W o r l d !
    
  • 遍历数字列表:打印 1 到 10 的数字。

    def test_for_2():
        print("测试循环语句...")
        print("\n打印数字 1 到 10...")
        for i in range(1, 11):  # 使用 range 函数生成 1 到 10 的数字序列
            print(i, end=" ")  # 输出:1 2 3 4 5 6 7 8 9 10
    

    range 的作用与用法:

    • 生成从起始值到结束值(不包含结束值)的整数序列。
    • 常见形式:
      • range(stop):生成从 0stop-1 的整数序列。
      • range(start, stop):生成从 startstop-1 的整数序列。
      • range(start, stop, step):生成从 startstop-1 的整数序列,步长为 step
  • while 循环:在某个条件成立时反复执行一段代码,直到条件不再满足为止。

    while 条件表达式:
        循环体
    

    示例:编写一个程序,从数字 1 开始,不断累加每个数字的平方,直到累加和超过 1000 为止。

    def test_while():
        print("测试循环语句...")
        print("\n使用 while 循环...")
        current_number = 1  # 当前数字,从 1 开始
        sum_of_squares = 0  # 累加和,初始值为 0
        while sum_of_squares <= 1000:
            sum_of_squares += current_number ** 2
            current_number += 1
        print("累加和 =", sum_of_squares)
        print("最后一个被累加的数字 =", current_number - 1)
    

break语句
  • 基本概念和用途:
    break 是一个用于提前结束循环的关键字。当程序运行到 break 时,会立即跳出当前所在的循环,不再执行循环中剩余的代码。它通常用在需要根据某个条件提前终止循环的情况下,比如找到目标值后就停止搜索。

  • 示例:寻找数字 5

假设有一个数字列表 [1, 2, 3, 4, 5, 6],希望找到数字 5 后立刻停止循环。代码如下:

def test_brak():
    print("\n测试break语句...")
    # 假设有一个数字列表 `[1, 2, 3, 4, 5, 6]`,希望找到数字 5 后立刻停止循环。
    numbers = [1, 2, 3, 4, 5, 6]    # 定义一个数字列表``
    for num in numbers:
        if num == 5:
            print("找到了数字 5")
            break  

输出结果为:

找到了数字 5
  • 注意事项:

    • break 只能用于循环(如 forwhile),不能单独使用。

    • 使用 break 时要确保逻辑清晰,避免因为过早跳出循环导致遗漏必要的操作。


continue语句
  • 基本概念和用途:

    continue 是一个用于跳过当前循环中剩余代码并直接进入下一次循环的关键字。它常用于过滤掉不需要处理的情况,比如跳过某些特定值或条件。

  • 示例 1:打印奇数
    假设有一个数字列表 [1, 2, 3, 4, 5, 6],只希望打印其中的奇数。代码如下:

def test_continue():
    print("\n测试continue语句...")
    # 假设有一个数字列表 `[1, 2, 3, 4, 05, 6]`,只希望打印其中的奇数。
    numbers = [1, 2, 3, 4, 5, 6]
    for num in numbers:
        if num % 2 == 0:    # 如果数字是偶数,则跳过本次循环
            continue        # 跳过本次循环,继续下一次循环
        print(num)

输出结果为:

1
3
5
  • 注意事项:

    • continue 不会终止整个循环,只会跳过当前循环,继续下一次循环。

    • 如果 continue 使用不当,可能会导致某些代码永远无法被执行。


else子句
  • 基本概念和用途:

else 子句可以附加在循环(forwhile)后面,用于在循环正常结束后执行一段代码。如果循环被 break 提前终止,则 else 子句不会被执行。它通常用于检查循环是否完整执行完毕,比如搜索目标值时判断是否找到。

  • 示例:查找数字 7

假设有一个数字列表 [1, 2, 3, 4, 5],希望查找数字 7。如果找到则打印“找到了”,否则打印“未找到”。代码如下:

def test_else():    
    print("\n测试else语句...")
    # 假设有一个数字列表 `[1, 2, 3, 4, 5]`,希望查找数字 7。
    # 如果找到则打印“找到了”,否则打印“未找到”。
    numbers = [1, 2, 3, 4, 5]
    for num in numbers:
        if num == 7:
            print("找到了数字 7")
            break
    else:
        print("未找到数字 7")   # 没有找到数字 7,执行else语句

输出结果为:

未找到数字 7
  • 注意事项:

    • else 子句只有在循环自然结束时才会执行,如果循环被 break 提前终止,则不会执行。
  • 初学者可能容易混淆 if-else 和循环的 else,需要注意它们的区别:前者是条件分支,后者是循环的补充部分。


嵌套循环(多重循环)
  • 基本概念和用途:
    嵌套循环是指在一个循环的内部再放置另一个循环,形成多层结构。外层循环每执行一次,内层循环会完整运行一遍。这种结构通常用于处理需要多层次遍历的任务,比如操作二维表格、矩阵运算或生成排列组合。

  • 示例 1:打印九九乘法表
    以下代码使用嵌套循环生成一个简单的九九乘法表:

 def test_fors():   
    print("\n测试嵌套循环...")
    # 使用嵌套循环生成一个简单的九九乘法表:
    for i in range(1, 10):  # 外层循环控制行数
        for j in range(1, i + 1):  # 内层循环控制列数
            print(f"{j} * {i} = {i * j}", end="\t")  # 打印乘法公式
        print()  # 换行

输出结果为:

1 * 1 = 1	
1 * 2 = 2	2 * 2 = 4	
1 * 3 = 3	2 * 3 = 6	3 * 3 = 9	
...
1 * 9 = 9	2 * 9 = 18	3 * 9 = 27	...	9 * 9 = 81
  • 示例 2:查找二维列表中的目标值
    假设有一个二维列表 [[1, 2, 3], [4, 5, 6], [7, 8, 9]],希望找到数字 5 并打印其位置。代码如下:
def test_fors():  
    print("\n测试嵌套循环...")
    # 假设有一个二维列表 `[[1, 2, 3], [4, 5, 6], [7, 8, 9]]`,
    # 希望找到数字 5 并打印其位置。
    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    for row_index in range(len(matrix)):  # 遍历每一行
        for col_index in range(len(matrix[row_index])):  # 遍历每一列
            if matrix[row_index][col_index] == 5:
                print(f"找到数字 5,位于第 {row_index + 1} 行,第 {col_index + 1} 列")

输出结果为:

找到数字 5,位于第 2 行,第 2 列
  • 注意事项:

    • 嵌套循环的层数不宜过多,否则会导致程序运行效率下降,在设计时要尽量保持简洁和高效。

      嵌套循环的外层循环每执行一次,内层循环会完整地运行一轮,例如:在两层的嵌套循环中,如果外层循环重复执行了 m m m 次,内层循环重复执行了 n n n 次,则这个嵌套循环一共执行了 m × n m \times n m×n 次,因此嵌套循环的层数越多,程序的运行时间可能会显著增加。

    • 在嵌套循环中,内层循环的变量名不要与外层循环冲突,以免引发逻辑错误。

    • 如果需要提前终止嵌套循环,可以结合 break 和标志变量(如 found = True)来实现。


四、综合示例
猜数字游戏

程序随机设定一个目标数字(假设为 7)。玩家最多有 3 次机会猜测这个数字。如果猜中,则立即结束游戏并提示“恭喜你,猜对了!”;如果用完所有机会仍未猜中,则提示“很遗憾,游戏结束”。

def guess_number():
    target_number = 7  # 目标数字
    max_attempts = 3   # 最大尝试次数

    for attempt in range(1, max_attempts + 1):  # 外层循环控制尝试次数
        guess = int(input("请输入一个数字(1-10):"))  # 获取玩家输入
        if guess == target_number:  # 条件判断:是否猜中
            print("恭喜你,猜对了!")
            break  # 猜中后立即结束循环
        elif guess < target_number:  # 条件判断:是否猜小了
            print("太小了!")
        else:  # 条件判断:是否猜大了
            print("太大了!")
    else:  # 循环正常结束后执行(即未猜中时)
        print("很遗憾,游戏结束。正确答案是", target_number)
运行示例
  • 情况 1:玩家在第 2 次猜中

输入:

请输入一个数字(1-10):5
太小了!
请输入一个数字(1-10):7
恭喜你,猜对了!
  • 情况 2:玩家用完所有机会仍未猜中

输入:

请输入一个数字(1-10):3
太小了!
请输入一个数字(1-10):9
太大了!
请输入一个数字(1-10):4
太小了!
很遗憾,游戏结束。正确答案是 7
代码解析
  1. 循环部分

    • 使用 for 循环控制玩家的尝试次数,最多允许尝试 3 次。
    • 每次循环代表一次猜测机会。
  2. 条件部分

    • 使用 if 判断玩家输入是否等于目标数字。如果猜中,使用 break 提前结束循环。
    • 使用 elifelse 分别处理“猜小了”和“猜大了”的情况。
  3. else 子句

    • 如果循环正常结束(即玩家未猜中),执行 else 子句,提示游戏结束。

流程控制语句在日常编程中无处不在。通过掌握条件语句和循环语句,读者可以编写出更加灵活和智能的程序,解决实际问题的能力也会大大提升。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程工人士

你的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值