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

坚持用 清晰易懂的图解 + 代码语言,让每个知识点变得简单!

🚀呆头个人主页详情

🌱 呆头个人Gitee代码仓库

📌 呆头详细专栏系列

座右铭: "不患无位,患所以立。"


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


前言

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

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

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

✍️ 你将获得:

✅ 每章配套「渡劫雷法」(实战项目)

✅ 避免走火入魔的「心魔警示」(避坑指南)

✅ 飞升大能的「神识传承」(大佬代码赏析)

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

(正文开始👇)


目录

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

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

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

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

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

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

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

python 复制代码
# 基本if语句
age = 20

if age >= 18:
    print("你已经成年了")
    print("可以独立做决定了")

print("程序继续执行...")  # 无论条件是否满足,这行都会执行

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

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

python 复制代码
# if-else语句
temperature = 35

if temperature > 30:
    print("今天天气很热")
    print("记得多喝水")
else:
    print("今天天气不算太热")
    print("适合户外活动")

print("程序继续执行...")

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

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

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

python 复制代码
# if-elif-else语句
score = 85

if 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.嵌套条件语句:复杂决策树

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

python 复制代码
# 嵌套条件语句
age = 25
has_ticket = True

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

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

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

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

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循环用于遍历序列(如列表、元组、字符串)或其他可迭代对象:

python 复制代码
# 基本for循环
fruits = ["苹果", "香蕉", "橙子", "葡萄"]

for fruit in fruits:
    print(f"我喜欢吃{fruit}")

print("循环结束")

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

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

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

python 复制代码
# 使用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循环会一直执行,直到指定的条件变为假:

python 复制代码
# 基本while循环
count = 0

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

print("循环结束")

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

4.无限循环与break语句

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

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

print("程序结束")

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

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

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

python 复制代码
# 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退出)时执行:

python 复制代码
# 循环的else子句
for i in range(5):
    print(i)
else:
    print("循环正常完成")

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

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

7.嵌套循环:多层迭代

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

python 复制代码
# 嵌套循环
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' }}}%% quadrantChart title 图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]

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

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

python 复制代码
import random

def guess_number_game():
    """简单的猜数字游戏"""
    # 生成1到100之间的随机数
    secret_number = random.randint(1, 100)
    attempts = 0
    max_attempts = 10
    
    print("欢迎来到猜数字游戏!")
    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循环:

python 复制代码
# 传统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()函数非常有用:

python 复制代码
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()函数非常有用:

python 复制代码
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个元素。

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

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

python 复制代码
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("请输入要标记为完成的待办事项编号: ")) - 1
                    if 0 <= index < len(todos):
                        todos[index]["completed"] = True
                        print(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("请输入要删除的待办事项编号: ")) - 1
                    if 0 <= index < len(todos):
                        deleted_task = todos.pop(index)
                        print(f"已删除: {deleted_task['task']}")
                    else:
                        print("无效的编号!")
                except ValueError:
                    print("请输入有效的数字!")
        
        elif choice == '5':
            # 退出程序
            print("感谢使用待办事项管理器!再见!")
            break
        
        else:
            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编程

相关推荐
墨城之左几秒前
低版本 IntelliJ IDEA 使用高版本 JDK 语言特性的问题
java·开发语言·intellij-idea·jdk21
别来无恙14936 分钟前
Java Web开发:Session与Cookie详细入门指南
java·开发语言
在钱塘江41 分钟前
LangGraph构建Ai智能体-11-高级RAG之Self-RAG
人工智能·python
华阙之梦1 小时前
QT环境搭建
开发语言·qt
GalaxyPokemon1 小时前
Linux的pthread怎么实现的?(包括到汇编层的实现)
运维·开发语言·c++
NeoFii1 小时前
Day 39: 图像数据与显存
python·深度学习·机器学习
lsx2024061 小时前
Ruby 条件判断
开发语言
臻实2 小时前
Win10系统Ruby+Devkit3.4.5-1安装
开发语言·后端·ruby
IT毕设实战小研2 小时前
Java毕业设计选题推荐 |基于SpringBoot的水产养殖管理系统 智能水产养殖监测系统 水产养殖小程序
java·开发语言·vue.js·spring boot·毕业设计·课程设计
努力自学的小夏2 小时前
RK3568 Linux驱动学习——新字符设备驱动
linux·arm开发·驱动开发·笔记·学习