Python从入门到实战(三):流程控制与循环语句 目录一、程序为什么需要流程控制1. 程序默认执行流程2. 顺序、分支、循环二、分支语句1. 分支语句的三种形态1.1 单分支语句if2.2 双分支语句if...else3.3 多分支语句if...elif...else2. 嵌套分支与代码优化3. 分支结构案例闰年判断四、while 循环1. while 循环的语法与底层执行流程2. 死循环3. while 循环实战案例五、for 循环1. for 循环与可迭代对象2. range() 函数详解3. for 循环与 while 循环六、循环控制语句1. 跳转控制break 与 continue2. 对比 break 与 continue3. 实际案例七、嵌套循环1. 嵌套循环的结构2. 经典案例2.1 九九乘法表2.2 二维坐标遍历八、综合案例1. 猜数字游戏2. 几何图形打印总结一、程序为什么需要流程控制在学习如何编写复杂的业务逻辑之前必须先理解计算机是如何执行代码的。结构化程序设计提出了三种基本控制结构它们是构建所有复杂软件系统的基石1. 程序默认执行流程在默认情况下Python 解释器会按照代码在源文件中的物理编写顺序从上到下、从左到右依次逐行执行。这种逐行不间断执行的模式被称为顺序结构# 顺序结构示例 x 10 y 20 result x y print(result) # 严格按照1、2、3、4行的顺序执行顺序结构适合处理线性、无分支的简单计算任务。然而现实世界中的业务逻辑往往包含大量的条件选择如若用户未登录则跳转已登录则放行或重复操作如批量发送1万封邮件。单凭顺序结构无法满足这些复杂的场景需求什么是流程控制流程控制是指通过特定的语法结构在程序运行时有目的地改变代码的执行顺序引入流程控制的目的是为了打破单一的顺序结构赋予程序 逻辑判断与 重复执行 的能力。通过流程控制程序可以根据运行时的实时数据状态自主决定哪些代码应该执行哪些代码应该跳过或者某些代码需要重复执行多少次2. 顺序、分支、循环无论是简单的脚本还是大型的分布式系统其核心控制逻辑都可以拆解为以下三种基本结构的组合顺序结构程序的核心主干代码按书写顺序依次向下执行分支结构又称选择结构。程序根据给定的条件进行判断条件成立时执行某一分支的代码条件不成立时执行另一分支的代码即 二选一 或 多选一循环结构程序根据给定的条件重复执行某一段代码。只要条件持续满足该段代码就会不断运行直到条件不再满足时才退出循环二、分支语句分支结构允许程序根据运行时特定的条件来选择性地执行不同的代码块。Python 中主要通过 if、elif 和 else 三个关键字来实现这一机制1. 分支语句的三种形态1.1 单分支语句if单分支语句是选择结构最基础的形式。当指定的条件表达式评估为 True 时执行其下方缩进的代码块若为 False则直接跳过score 90 if score 60: print(成绩合格) # 只有条件满足时执行Python 的缩进语法与许多使用花括号定义代码块的语言如 C、Java不同Python 严格使用强制缩进通常为 4 个空格来表示代码的层次与从属关系。缩进不一致会导致 IndentationError2.2 双分支语句if...else双分支语句用于处理 非此即彼 的场景。当条件满足时执行 if 块不满足时则必然执行 else 块age 16 if age 18: print(已成年) else: print(未成年)3.3 多分支语句if...elif...else当需要评估的互斥条件超过两个时应当使用多分支语句。程序会从上到下依次检测条件一旦触发了某一个满足条件的判定块执行完该块内部的代码后整个多分支结构便会立即结束后续的 elif 和 else 均不再进行判断score 85 if score 90: print(优秀) elif score 80: print(良好) # 代码命中此处执行后直接跳出整个分支结构 elif score 60: print(及格) else: print(不及格)2. 嵌套分支与代码优化嵌套分支是指在一个分支语句的代码块内部又包含了一个或多个完整的分支语句。它通常用于多层、递进式的条件筛选# 嵌套分支示例进入复试阶段且成绩优秀 is_in_finals True score 95 if is_in_finals: print(已进入复试阶段) if score 90: print(荣获优秀学员称号) else: print(通过复试) else: print(未进入复试)如何避免嵌套过深在实际项目开发中如果条件判断过于复杂多层嵌套通常超过 3 层会导致代码向右剧烈延伸形成所谓的 箭头型代码严重破坏代码的可读性和可维护性我们可以通过以下两种手段来优化过深的嵌套使用逻辑运算符and / or如果多个条件具有逻辑上的关联性可以通过逻辑运算符将其合并至同一层级引入 卫语句 思想卫语句的核心是将错误、异常或边界条件提前取反并退出如使用 return 或跳出从而让核心业务逻辑保持在最外层# 优化前深度嵌套 if user.is_active: if user.has_permission: if token.is_valid: print(执行核心业务) # 优化后利用逻辑运算符扁平化 if user.is_active and user.has_permission and token.is_valid: print(执行核心业务)3. 分支结构案例闰年判断为了融合本章知识下面编写一个判断给定年份是否为闰年的程序。判定规则能被 4 整除但不能被 100 整除或者能被 400 整除# 接收用户输入并转换为整型 year int(input(请输入需要查询的年份)) # 结合逻辑运算符的高效分支判定 if (year % 4 0 and year % 100 ! 0) or (year % 400 0): print(f{year} 年是闰年。) else: print(f{year} 年是平年。)四、while 循环在程序设计中当需要重复执行某段代码时如果机械地复制粘贴不仅会导致代码极度臃肿还会使后期的维护工作寸步难行。为此编程语言引入了循环结构while 循环是 Python 中最基本的循环控制结构之一它属于条件控制循环即循环的执行与终止完全取决于某个特定条件是否成立1. while 循环的语法与底层执行流程while 循环的基本语法结构非常简洁类似于一个会重复执行的 if 语句while 条件表达式: 循环体需要重复执行的代码块执行流程程序运行到 while 语句时首先判断后面的条件表达式如果条件表达式的值为 True程序将进入并执行其下方循环体代码循环体执行完毕后控制流会重新回到 while的条件判定处再次判断条件表达式只要条件表达式持续为 True上述过程就会不断重复一旦结果为 False循环立即终止程序向下执行后续的结构2. 死循环在编写 while 循环时开发者需要承担维护循环状态的责任。如果逻辑不当很容易陷入死循环死循环的成因死循环是指循环的条件表达式恒为 True导致控制流永远无法触发退出条件程序将在该代码块中无限执行。 常见的成因有两种缺少步进语句忘记在循环体内修改控制循环条件的变量条件判定逻辑错误设定的条件在数学或逻辑上不可能变为 False# 典型错误示范缺少步进导致死循环 count 1 while count 5: print(count) # 由于忘记书写 count 1count 永远为 1循环将无限执行下去死循环的应用场景并非所有的死循环都是程序漏洞。在某些特定的工程开发场景中我们主动需要构建一个死循环。例如操作系统底层的事件监听等待用户点击鼠标Web 服务器持续监听网络端口等待客户端的访问请求在这些场景下我们通常会配合后续会讲到的循环控制语句在特定外部事件发生时强制跳出3. while 循环实战案例下面我们通过两个经典的计数与累加案例来理解while 循环的实际应用案例 A1 到 100 的连续自然数累加计算 1 2 3 ... 100 的最终和# 初始化累加器与计数器 total_sum 0 i 1 # 循环条件计数器不超过 100 while i 100: total_sum i # 将当前计数值累加进结果 i 1 # 步进语句计数器自增确保循环能正常终止 print(f1到100的累加结果为{total_sum}) # 输出5050案例 B受控的用户输入验证强制要求用户输入指定格式的内容如果不符合要求则持续提示重新输入# 初始化变量 password # 只要密码不是 123456循环就会一直拦截并重试 while password ! 123456: password input(请输入管理员密码以解锁系统) print(密码正确系统已解锁。)五、for 循环与基于条件判断的 while 循环不同Python 中的 for 循环是一种计数控制或遍历控制循环。它专注于在特定的序列或可迭代对象上进行循环自动提取其中的每一个元素直至元素被全部处理完毕1. for 循环与可迭代对象for 循环的基本语法形式极具可读性非常接近自然语言的表达for 变量 in 可迭代对象: 循环体什么是可迭代对象在 Python 中可迭代对象是指内部包含多个元素且支持被逐一获取、遍历的容器。我们后续章节会详细学习的数据类型如字符串 str、列表 list、元组 tuple、字典 dict 等全都是可迭代对象当 for 循环执行时它会自动从可迭代对象中取出第一个元素赋值给前面的变量并执行一次循环体随后自动获取第二个、第三个元素直到可迭代对象内的所有元素被耗尽循环便平稳退出# 示例通过 for 循环直接遍历字符串中的每一个字符 text Python for char in text: print(char) # 会依次分行打印 P、y、t、h、o、n2. range() 函数详解在实际开发中如果我们不需要遍历具体的容器而只是想让一段代码重复执行指定的次数例如执行 10 次通常会配合内置的 range 函数来生成数字序列range() 函数在内存管理上表现得非常优秀。它并不会在内存中直接生成一个庞大的实体列表而是返回一个延迟计算的生成器对象只有在循环迭代到那一步时才会动态生成对应的数字这极大地节省了系统内存根据传入参数的不同range() 拥有以下三种常见格式单参数写法range(stop)含义生成一个从 0 开始、到 stop 结束且不包含 stop 自身的连续整数序列步长默认为 1# 循环生成 0, 1, 2, 3, 4 for i in range(5): print(i, end ) # 输出0 1 2 3 4双参数写法range(start, stop)含义生成一个从 start 开始、到 stop 结束且不包含 stop的连续整数序列。区间规则遵循数学上的左闭右开区间 [start, stop)# 循环生成 2, 3, 4, 5, 6 for i in range(2, 7): print(i, end ) # 输出2 3 4 5 6三参数写法range(start, stop, step)含义生成一个从 start 开始、到 stop 结束不含 stop、且数值之间间隔为 step步长的整数序列反向迭代如果 step 为负数则可以生成递减的倒序数字序列此时 start 应大于 stop# 正向步长获取 10 以内的所有正奇数 for i in range(1, 10, 2): print(i, end ) # 输出1 3 5 7 9 # 负向步长实现倒计时效果 for i in range(5, 0, -1): print(i, end ) # 输出5 4 3 2 13. for 循环与 while 循环特性while 循环for 循环循环类型条件控制循环由表达式真假控制计数/迭代控制循环由遍历边界控制次数已知性适合处理循环次数未知、依赖外部状态变化的场景适合处理循环次数明确、或处理现成容器的场景死循环风险较高若遗漏状态步进极易导致死循环极低随着序列元素耗尽必定能安全退出六、循环控制语句在程序执行循环的过程中有时我们需要根据业务状态改变循环的执行。Python 提供了 break 和 continue 两个控制关键字用于在循环内部实施跳转控制1. 跳转控制break 与 continuebreak终止当前循环break 关键字用于立即终止当前所在的那一层循环。一旦在循环体中触发了 break 程序将不再判断循环条件也不再执行循环体中剩余的代码而是直接跳出整个循环结构向下执行循环之外的后续代码# break 示例当计数器等于 3 时强行切断循环 for i in range(1, 6): if i 3: print(触发 break退出循环。) break print(f当前数字{i})continue进入下一次循环continue 关键字的作用是立即结束本次当前这一轮循环迭代。当程序遇到 continue 时会跳过循环体中位于 continue 之后的所有剩余代码直接开始全新一轮的循环# continue 示例跳过数字 3 for i in range(1, 6): if i 3: continue # 直接结束本轮不再执行下方的 print print(f当前数字{i})2. 对比 break 与 continue为了更清晰地理解这两个关键字在执行流和内存控制层面的区别我们可以通过下表进行对比特性break 关键字continue 关键字影响范围终止整个循环结构的运行仅终止当前单次迭代的运行执行流跳出循环体走向整个循环底部的后续代码回到循环头部开始下一次条件判定或元素抓取常见场景找到目标数据后提前退出、死循环的受控中止过滤不符合特定要求的无效数据数据清洗3. 实际案例下面我们通过一个带有次数限制的密码输入逻辑来体会循环控制语句在真实业务中的协同应用# 设定初始状态 correct_password abc max_trials 3 for trial in range(1, max_trials 1): input_pwd input(f请输入银行卡密码第 {trial} 次尝试) if input_pwd correct_password: print(密码正确正在登录系统...) break # 验证成功无需进行后续的尝试彻底跳出循环 # 如果密码错误提示剩余次数 remaining_trials max_trials - trial if remaining_trials 0: print(f密码错误您还剩 {remaining_trials} 次机会。) else: print(3次机会已耗尽该银行卡已被冻结)七、嵌套循环在实际开发中单层循环往往只能处理一维的线性数据。当面对多维数据如多维列表或复杂的组合逻辑时需要在一个循环结构的内部再完整地嵌套另一个循环结构这种模式被称为嵌套循环1. 嵌套循环的结构嵌套循环通常包含两层外部的循环称为外层循环内部的循环称为内层循环执行流程嵌套循环的联动机制可以概括为外层循环每执行一步循环一轮内层循环都需要从头到尾完整地执行一遍循环一整轮如果外层循环需要执行 M 次内层循环需要执行 N 次那么内层循环体中的核心代码总共将会被执行 M * N 次for i in range(1, 3): # 外层循环执行 2 次 print(f--- 外层循环 i {i} 开始 ---) for j in range(1, 4): # 内层循环执行 3 次 print(f 内层循环 j {j})注意嵌套循环中的 break 行为如果在内层循环中触发了 break 语句它只能跳出当前所在的内层循环而无法直接中断外层循环。外层循环依然会继续推进到下一个元素2. 经典案例2.1 九九乘法表九九乘法表是理解嵌套循环行与列联动逻辑的经典案例。在输出时外层循环控制乘法表的行数内层循环控制每一行打印的列数# 外层循环控制行数从 1 到 9 for i in range(1, 10): # 内层循环控制每行的列数列数 j 不能超过当前行数 i for j in range(1, i 1): print(f{j}*{i}{i*j}, end\t) # 当一整行的列公式全部打印完毕后调用空的 print() 实现换行 print()输出示例2.2 二维坐标遍历在处理图形学、游戏地图或者矩阵数据时我们常常需要生成或遍历一个多维的坐标网格# 模拟遍历一个 3 行 4 列的二维像素矩阵 for row in range(1, 4): # 控制行坐标 Y for col in range(1, 5): # 控制列坐标 X print(f({row}, {col}), end ) print() # 换行输出示例八、综合案例通过前几章的学习我们已经掌握了顺序、分支、循环以及循环控制语句的基本语法。为了将这些碎片化的知识点融会贯通本章将通过两个经典的综合实战案例演示如何在实际开发中构建具备复杂逻辑的程序1. 猜数字游戏业务描述程序自动生成一个 1 到 100 之间的随机整数。用户共有 5 次猜测机会如果猜出的数字大于正确答案提示 太大了如果猜出的数字小于正确答案提示 太小了如果在规定次数内猜对提示 恭喜你猜对了 并提前终止程序如果 5 次机会耗尽仍未猜对则宣告游戏结束并公布正确答案要点分析随机数生成需要引入 Python 标准库中的 random 模块并调用 random.randint(1, 100)状态拦截与跳转使用 while 或 for 循环控制猜测次数结合 if...elif...else 进行大小判定并在猜对时利用 break 强行跳出循环代码实现import random # 1. 初始化游戏数据生成 1 到 100 的随机数设置最大尝试次数 target_number random.randint(1, 100) max_chances 5 # 2. 利用 for 循环控制猜测轮次 for current_round in range(1, max_chances 1): # 接收输入并转换为整型 guess int(input(f\n【第 {current_round} 次猜测】请输入你猜的数字)) # 3. 条件判定 if guess target_number: print(f恭喜你在第 {current_round} 轮就猜对了答案正是 {target_number}。) break elif guess target_number: print(提示太大了) else: print(提示太小了) # 4. 次数耗尽提示机制 remaining max_chances - current_round if remaining 0: print(f你还剩 {remaining} 次机会。) else: print(f\n游戏结束正确答案是{target_number}。)2. 几何图形打印下面我们分别实现直角三角形与等腰金字塔两个经典图形靠左直角三角形我们希望在控制台输出一个由五行组成的直角三角形形态如下* ** *** **** *****逻辑分析总共有 5 行外层循环控制行数 i。仔细观察规律可以发现第 i 行包含的星号 * 数量正好也是 i 个内层循环控制打印星号的数量# 直角三角形代码实现 rows 5 for i in range(1, rows 1): # 外层循环控制行数 (1 到 5) for j in range(1, i 1): # 内层循环控制每行的星号数量 (1 到 i) print(*, end) # 连续打印星号不换行 print() # 整行打印完毕后触发换行等腰金字塔等腰金字塔的打印逻辑稍显复杂每一行不仅需要控制星号的数量还需控制星号左侧的空格数量* *** ***** ******* *********逻辑分析假设总行数为 N5对于第 i 行其左侧的空格数量为 N - i 个例如第 1 行有 4 个空格第 2 行有 3 个空格对于第 i 行其内部包含的星号数量为 2 * i - 1 个例如第 1 行有 1 个第 2 行有 3 个第 3 行有 5 个因此我们需要在外层循环内部依次安排两个并列的内层循环一个负责填充空格另一个负责填充星号# 等腰金字塔代码实现 total_rows 5 for i in range(1, total_rows 1): # 内层循环一控制打印左侧的空格数量 for j in range(1, total_rows - i 1): print( , end) # 内层循环二控制打印当前行的星号数量 for k in range(1, 2 * i): print(*, end) # 两种元素填充完毕后执行换行 print()总结本篇我们由浅入深地构建了 Python 程序的逻辑控制框架。我们首先理解了打破顺序执行流的必要性并系统学习了分支语句if...elif...else在处理多路互斥条件时的底层截断运行机制探究了如何利用逻辑运算符与卫语句思维避免深层的代码嵌套随后我们对比学习了两种截然不同的循环形态基于条件控制、适合处理未知执行次数的 while 循环以及基于计数与迭代控制、配合 range() 内存惰性序列的 for 循环。同时我们剖析了 break 与 continue 对控制流重定向的区别。最后通过嵌套循环在多维空间下的联动机制我们成功实现了复杂控制台游戏的开发以及特定几何矩阵的动态输流程控制赋予了程序处理复杂现实业务的决策能力。至此你已经具备了编写具有独立交互、逻辑控制功能的完整脚本的能力。在下一篇教程中我们将迈进 Python 进阶的核心门槛探索组合数据类型列表、元组、字典、集合的存储与管理