当前位置: 首页 > news >正文

《Python学习之基础语法2:掌握程序流程控制的艺术》

坚持用 清晰易懂的图解 + 代码语言,让每个知识点变得简单!
🚀呆头个人主页详情
🌱 呆头个人Gitee代码仓库
📌 呆头详细专栏系列
座右铭: “不患无位,患所以立。”
在这里插入图片描述


Python学习之基础语法2:掌握程序流程控制的艺术

  • 前言
  • 目录
  • 一、顺序语句:程序的默认流程
  • 二、条件语句:程序的"决策点"
    • 1.if语句:最基本的条件判断
    • 2.if-else语句:二选一的决策
    • 3.if-elif-else语句:多条件判断
    • 4.嵌套条件语句:复杂决策树
    • 5.条件表达式(三元运算符):简洁的条件赋值
  • 三、循环语句:程序的"重复器"
    • 1.for循环:迭代已知次数
    • 2.range()函数:生成数字序列
    • 3.while循环:条件控制的循环
    • 4.无限循环与break语句
    • 5.continue语句:跳过当前迭代
    • 6.else子句:循环正常完成时执行
    • 7.嵌套循环:多层迭代
  • 四、综合案例:猜数字游戏
  • 五、进阶技巧:Python的循环优化
    • 1.列表推导式:简洁的循环表达式
    • 2.enumerate()函数:同时获取索引和值
    • 3.zip()函数:并行迭代多个序列
  • 六、实战案例:简单的待办事项管理器
    • 总结与展望
    • 参考链接
    • 关键词标签


前言

🔥 “灵根检测发现:阁下竟是万中无一的编程奇才!”

这是一个用修仙世界观解构Python学习的硬核专栏:

  • 练气期:变量/循环/函数(基础心法)
  • 筑基期:面向对象/异常处理(护体罡气)
  • 金丹期:爬虫/数据分析(神通初成)
  • 元婴期:Django/机器学习(开辟紫府)

✍️ 你将获得:
✅ 每章配套「渡劫雷法」(实战项目)
✅ 避免走火入魔的「心魔警示」(避坑指南)
✅ 飞升大能的「神识传承」(大佬代码赏析)

“三千大道,Py为尊。本座在此布道,助你斩尽BUG,证道代码金仙!”

(正文开始👇)


目录

一、顺序语句:程序的默认流程

顺序语句是最基本的程序流程——代码从上到下、一行接一行地执行。这就像阅读一本书,从第一页读到最后一页,不跳过任何内容。

# 顺序执行示例
print("第一步:准备材料")
print("第二步:混合面粉和鸡蛋")
print("第三步:加入牛奶搅拌")
print("第四步:倒入平底锅")
print("第五步:煎至两面金黄")
print("完成!美味的煎饼已经准备好了")

上面的代码会按照编写的顺序一步一步执行,没有任何"岔路"。这是最简单的程序流程,但实际应用中,我们通常需要更复杂的控制结构。

二、条件语句:程序的"决策点"

条件语句允许程序根据特定条件选择不同的执行路径。这就像在道路上遇到岔路口,根据路标(条件)决定走哪条路。

1.if语句:最基本的条件判断

# 基本if语句
age = 20if age >= 18:print("你已经成年了")print("可以独立做决定了")print("程序继续执行...")  # 无论条件是否满足,这行都会执行

在上面的代码中,只有当age >= 18为真时,缩进的代码块才会执行。

2.if-else语句:二选一的决策

# if-else语句
temperature = 35if temperature > 30:print("今天天气很热")print("记得多喝水")
else:print("今天天气不算太热")print("适合户外活动")print("程序继续执行...")

if-else语句提供了两条可能的执行路径:如果条件为真,执行if后的代码块;否则,执行else后的代码块。

3.if-elif-else语句:多条件判断

当我们需要检查多个条件时,可以使用if-elif-else结构:

# if-elif-else语句
score = 85if score >= 90:grade = "A"
elif score >= 80:grade = "B"
elif score >= 70:grade = "C"
elif score >= 60:grade = "D"
else:grade = "F"print(f"你的成绩等级是:{grade}")

在这个例子中,Python会从上到下检查每个条件,一旦找到第一个为真的条件,就执行对应的代码块,然后跳过剩余的条件检查。

4.嵌套条件语句:复杂决策树

条件语句可以嵌套,创建更复杂的决策结构:

# 嵌套条件语句
age = 25
has_ticket = Trueif age >= 18:if has_ticket:print("你可以进入电影院")else:print("你需要先购买电影票")
else:if has_ticket:print("虽然你有票,但年龄不够,不能进入")else:print("你既没有达到年龄要求,也没有电影票")

嵌套条件可以表达复杂的逻辑关系,但过度嵌套会使代码难以阅读和维护。一般建议嵌套不超过3层,如果需要更复杂的逻辑,考虑重构代码或使用其他技术。

5.条件表达式(三元运算符):简洁的条件赋值

Python提供了一种简洁的条件表达式形式,也称为三元运算符:

# 条件表达式(三元运算符)
age = 20
status = "成年" if age >= 18 else "未成年"
print(status)  # 输出: 成年# 等价于以下if-else语句
if age >= 18:status = "成年"
else:status = "未成年"

条件表达式形式为:value_if_true if condition else value_if_false。这种形式简洁明了,特别适合简单的条件赋值。

让我们通过一个时序图来看看条件语句的执行流程:

Python解释器条件判断True分支False分支评估条件执行True分支代码返回执行结果执行False分支代码返回执行结果alt[条件为真][条件为假]继续执行后续代码无论条件结果如何,程序最终都会继续执行Python解释器条件判断True分支False分支

图2:条件语句执行时序图 - 展示了Python解释器如何处理条件判断和分支执行

三、循环语句:程序的"重复器"

循环允许我们重复执行代码块,这是处理集合数据和重复任务的强大工具。Python提供了两种主要的循环结构:for循环和while循环。

1.for循环:迭代已知次数

for循环用于遍历序列(如列表、元组、字符串)或其他可迭代对象:

# 基本for循环
fruits = ["苹果", "香蕉", "橙子", "葡萄"]for fruit in fruits:print(f"我喜欢吃{fruit}")print("循环结束")

for循环会遍历fruits列表中的每个元素,将当前元素赋值给变量fruit,然后执行循环体。

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

range()函数常与for循环一起使用,用于生成一个数字序列:

# 使用range()函数
# range(stop) - 从0开始,到stop-1结束
for i in range(5):print(i)  # 输出: 0, 1, 2, 3, 4# range(start, stop) - 从start开始,到stop-1结束
for i in range(2, 6):print(i)  # 输出: 2, 3, 4, 5# range(start, stop, step) - 从start开始,到stop-1结束,步长为step
for i in range(1, 10, 2):print(i)  # 输出: 1, 3, 5, 7, 9

range()函数非常有用,特别是当你需要执行特定次数的循环或需要索引值时。

3.while循环:条件控制的循环

while循环会一直执行,直到指定的条件变为假:

# 基本while循环
count = 0while count < 5:print(f"当前计数:{count}")count += 1  # 增加计数器,避免无限循环print("循环结束")

while循环在每次迭代前检查条件。如果条件为真,执行循环体;如果为假,退出循环。

4.无限循环与break语句

有时我们需要创建一个无限循环,然后在特定条件下使用break语句退出:

# 无限循环与break
while True:user_input = input("请输入一个命令(输入'quit'退出): ")if user_input.lower() == 'quit':print("退出程序")break  # 跳出循环print(f"你输入的命令是:{user_input}")print("程序结束")

break语句会立即终止当前循环,程序继续执行循环后的代码。

5.continue语句:跳过当前迭代

continue语句用于跳过当前迭代的剩余部分,直接进入下一次迭代:

# continue语句
for i in range(10):if i % 2 == 0:  # 如果i是偶数continue  # 跳过当前迭代print(i)  # 只打印奇数: 1, 3, 5, 7, 9

在这个例子中,当i是偶数时,continue语句会跳过print(i),直接进入下一次迭代。

6.else子句:循环正常完成时执行

Python的循环可以有一个else子句,当循环正常完成(不是通过break退出)时执行:

# 循环的else子句
for i in range(5):print(i)
else:print("循环正常完成")# 对比使用break的情况
for i in range(5):if i == 3:breakprint(i)
else:print("这条消息不会显示,因为循环被break中断了")

循环的else子句在循环正常完成时执行,如果循环被break语句中断,则不执行else子句。

7.嵌套循环:多层迭代

循环可以嵌套,创建多层迭代结构:

# 嵌套循环
for i in range(1, 4):  # 外层循环for j in range(1, 4):  # 内层循环print(f"({i}, {j})", end=" ")print()  # 换行# 输出:
# (1, 1) (1, 2) (1, 3)
# (2, 1) (2, 2) (2, 3)
# (3, 1) (3, 2) (3, 3)

嵌套循环在处理二维数据结构(如矩阵)或需要组合多个集合的元素时非常有用。

让我们通过一个象限图来比较不同类型的循环:

%%{init: {'theme': 'neutral', 'themeVariables': { 'primaryColor': '#88498F', 'primaryTextColor': '#fff', 'primaryBorderColor': '#552F6D', 'lineColor': '#88498F', 'secondaryColor': '#468F88', 'tertiaryColor': '#8F4646' }}}%%
quadrantCharttitle 图3:Python循环类型特性对比x-axis 灵活性低 --> 灵活性高y-axis 简单度高 --> 复杂度高quadrant-1 高灵活高复杂quadrant-2 低灵活高复杂quadrant-3 低灵活低复杂quadrant-4 高灵活低复杂"for循环": [0.4, 0.3]"while循环": [0.8, 0.5]"for + range()": [0.5, 0.4]"无限while + break": [0.9, 0.7]"列表推导式": [0.6, 0.6]"嵌套循环": [0.7, 0.8]"for + enumerate()": [0.6, 0.5]"for + zip()": [0.7, 0.6]

四、综合案例:猜数字游戏

现在,让我们将学到的顺序语句、条件语句和循环语句结合起来,创建一个简单而有趣的猜数字游戏:

import randomdef guess_number_game():"""简单的猜数字游戏"""# 生成1到100之间的随机数secret_number = random.randint(1, 100)attempts = 0max_attempts = 10print("欢迎来到猜数字游戏!")print(f"我已经想好了一个1到100之间的数字,你有{max_attempts}次机会猜出它。")while attempts < max_attempts:# 获取用户输入try:guess = int(input(f"请输入你的猜测(第{attempts + 1}次): "))except ValueError:print("请输入有效的数字!")continue# 增加尝试次数attempts += 1# 检查猜测if guess < secret_number:print("太小了!再大一点。")elif guess > secret_number:print("太大了!再小一点。")else:print(f"恭喜你!你猜对了!答案就是{secret_number}。")print(f"你用了{attempts}次尝试。")break# 如果用完了所有尝试次数仍未猜对if attempts == max_attempts and guess != secret_number:print(f"很遗憾,你已用完所有{max_attempts}次尝试机会。")print(f"正确答案是{secret_number}。")# 询问是否再玩一次play_again = input("想再玩一次吗?(y/n): ")if play_again.lower() == 'y':guess_number_game()  # 递归调用,重新开始游戏else:print("谢谢参与!下次再见。")# 启动游戏
if __name__ == "__main__":guess_number_game()

这个猜数字游戏展示了我们学习的各种流程控制结构:

  • 顺序语句:代码从上到下执行
  • 条件语句:使用if-elif-else检查猜测是大了、小了还是正确
  • 循环语句:使用while循环控制猜测次数,使用continue跳过无效输入
  • 异常处理:使用try-except捕获无效输入
  • 递归:通过函数调用自身实现游戏重新开始

五、进阶技巧:Python的循环优化

Python提供了一些特殊的工具和技巧,可以让我们的循环更加高效和优雅:

1.列表推导式:简洁的循环表达式

列表推导式是一种创建列表的简洁方式,可以替代某些for循环:

# 传统for循环
squares = []
for i in range(1, 11):squares.append(i ** 2)
print(squares)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]# 等价的列表推导式
squares = [i ** 2 for i in range(1, 11)]
print(squares)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]# 带条件的列表推导式
even_squares = [i ** 2 for i in range(1, 11) if i % 2 == 0]
print(even_squares)  # [4, 16, 36, 64, 100]

列表推导式不仅代码更简洁,在某些情况下还更高效。

2.enumerate()函数:同时获取索引和值

当需要在循环中同时获取元素的索引和值时,enumerate()函数非常有用:

fruits = ["苹果", "香蕉", "橙子", "葡萄"]# 传统方法
for i in range(len(fruits)):print(f"{i+1}. {fruits[i]}")# 使用enumerate()
for index, fruit in enumerate(fruits, start=1):  # start参数设置起始索引print(f"{index}. {fruit}")

enumerate()函数返回一个迭代器,生成(索引, 值)对,使代码更加清晰和Pythonic。

3.zip()函数:并行迭代多个序列

当需要同时迭代多个序列时,zip()函数非常有用:

names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
cities = ["北京", "上海", "广州"]for name, age, city in zip(names, ages, cities):print(f"{name}今年{age}岁,住在{city}")# 输出:
# Alice今年25岁,住在北京
# Bob今年30岁,住在上海
# Charlie今年35岁,住在广州

zip()函数将多个序列"压缩"在一起,返回一个元组的迭代器,其中第i个元组包含每个序列的第i个元素。

六、实战案例:简单的待办事项管理器

让我们再来一个实战案例,综合运用顺序语句、条件语句和循环语句,创建一个简单的待办事项管理器:

def todo_manager():"""简单的待办事项管理器"""todos = []  # 存储待办事项的列表while True:# 显示菜单print("\n===== 待办事项管理器 =====")print("1. 查看所有待办事项")print("2. 添加新的待办事项")print("3. 标记待办事项为完成")print("4. 删除待办事项")print("5. 退出")# 获取用户选择choice = input("请选择操作 (1-5): ")# 根据用户选择执行相应操作if choice == '1':# 查看所有待办事项if not todos:print("当前没有待办事项。")else:print("\n当前待办事项:")for i, todo in enumerate(todos, 1):status = "✓" if todo["completed"] else " "print(f"{i}. [{status}] {todo['task']}")elif choice == '2':# 添加新的待办事项task = input("请输入新的待办事项: ")if task:  # 确保输入不为空todos.append({"task": task, "completed": False})print(f"已添加: {task}")else:print("待办事项不能为空!")elif choice == '3':# 标记待办事项为完成if not todos:print("当前没有待办事项。")else:# 显示所有待办事项print("\n当前待办事项:")for i, todo in enumerate(todos, 1):status = "✓" if todo["completed"] else " "print(f"{i}. [{status}] {todo['task']}")try:index = int(input("请输入要标记为完成的待办事项编号: ")) - 1if 0 <= index < len(todos):todos[index]["completed"] = Trueprint(f"已将 '{todos[index]['task']}' 标记为完成")else:print("无效的编号!")except ValueError:print("请输入有效的数字!")elif choice == '4':# 删除待办事项if not todos:print("当前没有待办事项。")else:# 显示所有待办事项print("\n当前待办事项:")for i, todo in enumerate(todos, 1):status = "✓" if todo["completed"] else " "print(f"{i}. [{status}] {todo['task']}")try:index = int(input("请输入要删除的待办事项编号: ")) - 1if 0 <= index < len(todos):deleted_task = todos.pop(index)print(f"已删除: {deleted_task['task']}")else:print("无效的编号!")except ValueError:print("请输入有效的数字!")elif choice == '5':# 退出程序print("感谢使用待办事项管理器!再见!")breakelse:print("无效的选择,请重新输入!")# 启动待办事项管理器
if __name__ == "__main__":todo_manager()

这个待办事项管理器展示了如何将顺序语句、条件语句和循环语句结合起来,创建一个实用的命令行应用程序。它使用了:

  • 无限循环:使用while True创建主程序循环
  • 条件语句:使用if-elif-else处理不同的用户选择
  • 列表和字典:使用列表存储待办事项,使用字典存储每个待办事项的详细信息
  • enumerate():在显示待办事项时同时获取索引和值
  • 异常处理:使用try-except捕获无效输入

总结与展望

我建议大家在学习流程控制时,不要只是机械地记忆语法,而是要理解每种结构的适用场景和内在逻辑。尝试用不同的方式解决同一个问题,比较它们的优缺点。这样,你不仅能掌握语法,还能培养编程直觉和代码品味。

在下一篇文章中,我们将探讨Python的函数和模块,这些是构建更大型、更复杂程序的基础。我们将学习如何将代码组织成可重用的单元,如何传递和处理数据,以及如何利用Python丰富的标准库和第三方库来简化开发。

编程是一段永无止境的学习之旅。每掌握一个新概念,都会打开一扇通往更广阔世界的门。希望这篇文章能为你的Python学习之旅提供一些帮助和启发。记住,最好的学习方式是动手实践——写代码、调试、改进,然后再写更多代码。只有这样,你才能真正掌握编程的艺术。


📢 如果你也喜欢这种"不呆头"的技术风格:
👁️ 【关注】 看一个非典型程序员如何用野路子解决正经问题
👍 【点赞】 给"不写八股文"的技术分享一点鼓励
🔖 【收藏】 把这些"奇怪但有用"的代码技巧打包带走
💬 【评论】 来聊聊——你遇到过最"呆头"的 Bug 是啥?
🗳️ 【投票】 决定我下一篇写"如何用游戏思维学编程"还是"和 ChatGPT 结对编程的翻车现场"
技术没有标准答案,让我们一起用最有趣的方式,写出最靠谱的代码! 🎮💻

参考链接

  1. Python官方文档 - 控制流工具
  2. Real Python - Python条件语句教程
  3. Python循环最佳实践
  4. Python编程:从入门到实践
  5. Python Cookbook - 流程控制与迭代

关键词标签

#Python基础 #流程控制 #条件语句 #循环语句 #Python编程

http://www.xdnf.cn/news/1291465.html

相关文章:

  • 101、【OS】【Nuttx】【周边】文档构建渲染:reStructuredText 格式
  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day3
  • C++多态:理解面向对象的“一个接口,多种实现”
  • 《AVL树的原理与C++实现:详解平衡二叉搜索树的高效构建与操作》
  • 旧版MinIO的安装(windows)、Spring Boot 后端集成 MinIO 实现文件存储(超详细,带图文)
  • 使用 6 种方法将文件从 Android 无缝传输到iPad
  • [Linux]学习笔记系列 -- [arm][process]
  • WPF 开发的瑞士军刀:Prism 框架从入门到精通指南
  • C++写文件,open函数的参数in、out、ate、app、trunc等标志分别是什么作用?
  • C++ 面向对象四大特性:面试深度解析
  • 河南萌新联赛2025第五场 - 信息工程大学
  • IDEA创建一个VUE项目
  • C# 微软依赖注入 (Microsoft.Extensions.DependencyInjection) 详解
  • 数据分析项目----幸福感挖掘和预测
  • Python实战教程:PDF文档自动化编辑与图表绘制全攻略
  • PyTorch生成式人工智能——基于Transformer实现文本转语音
  • SeaTunnel MCP Server 入选《中国信通院开源商业产品及企业典型案例集(2025)》
  • 袖珍手持气象仪的用途
  • linux_网络层-ip协议
  • 开源日志log4cplus—调用MultiByteToWideChar提示未定义,CP_UTF8未定义定原因有哪些,如何改进?
  • 【安卓,问题记录】ImageView 在布局顺序上位于 Button 上方,却出现图像内容被 Button 遮挡
  • 北京JAVA基础面试30天打卡09
  • ELK开启安全策略
  • 【递归、搜索与回溯算法】穷举、暴搜、深搜、回溯、剪枝
  • String里常用的方法
  • w481社区老人健康信息管理系统的设计与实现
  • 5.语句几个分类
  • BGE:智源研究院的通用嵌入模型家族——从文本到多模态的语义检索革命
  • 开源WAF新标杆:雷池SafeLine用语义分析重构网站安全边界
  • 【C#】利用数组实现大数数据结构