【Python-Day 10】Python 循环控制流:while 循环详解与 for 循环对比

Langchain系列文章目录

01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
08-【万字长文】MCP深度解析:打通AI与世界的“USB-C”,模型上下文协议原理、实践与未来

Python系列文章目录

PyTorch系列文章目录

机器学习系列文章目录

深度学习系列文章目录

Java系列文章目录

JavaScript系列文章目录

Python系列文章目录

01-【Python-Day 1】告别编程恐惧:轻松掌握 Python 安装与第一个程序的 6 个步骤
02-【Python-Day 2】掌握Python基石:变量、内存、标识符及int/float/bool数据类型
03-【Python-Day 3】玩转文本:字符串(String)基础操作详解 (上)
04-【Python-Day 4】玩转文本:Python 字符串常用方法深度解析 (下篇)
05-【Python-Day 5】Python 格式化输出实战:%、format()、f-string 对比与最佳实践
06- 【Python-Day 6】从零精通 Python 运算符(上):算术、赋值与比较运算全解析
07-【Python-Day 7】从零精通 Python 运算符(下):逻辑、成员、身份运算与优先级规则全解析
08-【Python-Day 8】从入门到精通:Python 条件判断 if-elif-else 语句全解析
09-【Python-Day 9】掌握循环利器:for 循环遍历序列与可迭代对象详解
10-【Python-Day 10】Python 循环控制流:while 循环详解与 for 循环对比



前言

大家好!欢迎来到 Python 学习之旅的第 10 天。在上一篇 【Python-Day 9】重复的力量 - for 循环 中,我们学习了如何使用 for 循环来遍历序列或其他可迭代对象,这对于处理已知次数或已知集合的重复任务非常有用。然而,在编程中,我们经常遇到另一种情况:需要在某个条件满足时反复执行一段代码,但事先并不知道具体要执行多少次。这时,while 循环就派上用场了。本篇将带你深入理解 while 循环的机制、语法、控制方法以及与 for 循环的区别和适用场景。

一、while 循环的基础

while 循环是 Python 中另一种重要的循环结构,它允许我们根据一个条件来重复执行代码块。

1.1 什么是 while 循环?

while 循环,顾名思义,就是“当…时候”循环。它的核心思想是:只要指定的条件一直为真 (True),就持续执行循环体内的代码块。一旦条件变为假 (False),循环就停止。

我们可以用一个生活中的例子来类比:想象你在烧水,你会一直等待,只要 水还没有烧开(条件为真),你就继续等待(执行循环体)。当水烧开了(条件变为假),你就停止等待(结束循环)。

1.2 while 循环的基本语法

while 循环的语法结构非常简洁:

while <条件表达式>:
    # 条件为 True 时执行的代码块
    # ...
    # 通常需要包含改变条件表达式最终结果的代码
# 循环结束,执行后续代码

语法解析:

  1. while 关键字: 表明这是一个 while 循环。
  2. <条件表达式>: 这是一个能够计算出布尔值 (TrueFalse) 的表达式。常见的条件表达式包括比较运算 (>, <, ==, != 等) 和逻辑运算 (and, or, not)。
  3. 冒号 :: 跟在条件表达式后面,表示代码块的开始。
  4. 缩进的代码块: 这是循环体,包含当条件为 True 时需要重复执行的一条或多条语句。特别重要的是,循环体内部通常需要有能够影响 <条件表达式> 的语句,否则可能导致条件永远为真,形成“死循环”。

示例:打印 1 到 5 的数字

# 初始化计数器
count = 1

# 当 count 小于等于 5 时,循环继续
while count <= 5:
    print(f"Current count: {count}")
    # 关键:更新计数器,使条件最终能变为 False
    count += 1 # 等价于 count = count + 1

print("Loop finished!")

代码解释:

  • 我们首先初始化变量 count 为 1。
  • while count <= 5: 设置循环条件,只要 count 的值小于或等于 5,循环就会执行。
  • 循环体内,我们打印当前的 count 值。
  • count += 1 是关键步骤,它每次循环都将 count 的值增加 1。当 count 增加到 6 时,条件 6 <= 5 变为 False,循环结束。
  • 最后,打印 “Loop finished!”。

1.3 while 循环的工作流程

while 循环的执行过程可以用以下流程图表示:

流程说明:

  1. 检查条件: 首先计算 <条件表达式> 的值。
  2. 判断:
    • 如果条件为 True,执行缩进的循环体代码块。执行完毕后,再次回到步骤 1,重新检查条件。
    • 如果条件为 False,跳过循环体代码块,循环结束,程序继续执行 while 循环之后的代码。

二、while 循环的控制

for 循环类似,while 循环也提供了 breakcontinue 语句来更灵活地控制循环的执行流程。同时,我们需要特别注意避免死循环。

2.1 跳出循环:break 语句

break 语句用于立即终止当前所在的整个循环,不再检查循环条件,直接跳出循环,执行循环后面的代码。

2.1.1 break 的工作机制

当程序执行到 break 语句时,它会无视循环条件是否仍然为 True,强制退出循环。

2.1.2 使用场景与示例

break 常用于在循环过程中找到了需要的目标或满足了某个特殊退出条件时。

示例:查找列表中的第一个偶数

numbers = [1, 3, 5, 8, 9, 10]
index = 0
found_even = False # 标记是否找到偶数

while index < len(numbers):
    num = numbers[index]
    if num % 2 == 0: # 判断是否为偶数
        print(f"Found the first even number: {num} at index {index}")
        found_even = True
        break # 找到后立即退出循环
    index += 1

if not found_even:
    print("No even number found in the list.")

print("Code after the loop.")

代码解释:

  • 循环遍历 numbers 列表。
  • 如果 num % 2 == 0 条件满足(即找到偶数),打印信息,设置 found_even 标记为 True,然后执行 break,循环立即停止。
  • 如果循环遍历完整个列表都没有找到偶数(break 未被执行),循环会因为 index < len(numbers) 条件变为 False 而正常结束,此时 found_even 仍然是 False

2.2 跳过本次迭代:continue 语句

continue 语句用于结束当前这次循环迭代,跳过循环体中 continue 之后的所有语句,直接回到循环条件的判断处,开始下一次迭代(如果条件仍然满足)。

2.2.1 continue 的工作机制

continue 并不会终止整个循环,只是提前结束当前轮次的执行。

2.2.2 使用场景与示例

continue 常用于跳过某些不符合处理条件的数据,继续处理下一个。

示例:打印 1 到 10 之间的所有奇数

num = 0
while num < 10:
    num += 1
    if num % 2 == 0: # 如果是偶数
        continue # 跳过本次循环剩余部分(print语句),直接进行下一次迭代
    print(f"Odd number: {num}")

print("Loop finished.")

代码解释:

  • 循环从 num = 0 开始,每次迭代 num 加 1。
  • if num % 2 == 0: 判断 num 是否为偶数。
  • 如果是偶数,执行 continueprint 语句被跳过,直接进入下一次循环(检查 num < 10)。
  • 如果是奇数,if 条件不满足,continue 不执行,程序继续执行 print 语句。

2.3 警惕!while 循环的“死循环”陷阱

“死循环”(Infinite Loop)是指循环条件永远为 True,导致循环无法自行停止的情况。这是使用 while 循环时最常见的错误之一。

2.3.1 死循环是如何产生的?

通常是因为在循环体内忘记了更新那些能让循环条件最终变为 False 的变量。

示例:一个典型的死循环(错误示范)

# 危险:这将导致死循环!
count = 0
while count < 5:
    print("Stuck in the loop!")
    # 错误:没有更新 count 的值,count 永远是 0,条件 count < 5 永远为 True

2.3.2 如何避免和处理死循环?

(1) 确保更新条件变量

在设计 while 循环时,务必检查循环体内是否有逻辑能够确保循环条件最终会变为 False

修正上面的例子:

count = 0
while count < 5:
    print(f"Processing count: {count}")
    count += 1 # 正确:确保 count 的值会增加,最终使条件变为 False
print("Loop finished correctly.")
(2) 手动中断死循环

如果你不小心运行了一个死循环,在大多数终端或 IDE 中,可以按 Ctrl + C 组合键来强制中断程序的执行。

(3) 使用 break 作为保险

在某些复杂逻辑中,可以在循环内部设置一个额外的退出条件,并使用 break 来强制跳出,防止意外的死循环。

max_attempts = 10
attempt = 0
while True: # 使用 True 作为条件,依赖内部 break 退出
    print(f"Attempt {attempt + 1}...")
    # 做一些事情...
    
    # 增加尝试次数
    attempt += 1
    
    # 检查是否超过最大尝试次数
    if attempt >= max_attempts:
        print("Reached maximum attempts. Exiting.")
        break # 使用 break 作为退出机制

三、while 循环的进阶用法

除了基本的循环和控制,while 循环还有一个特殊的 else 子句。

3.1 while-else 结构:循环正常结束后的“彩蛋”

Python 的 while 循环(以及 for 循环)可以带有一个可选的 else 子句。这个 else 子句里的代码块仅在循环因为条件变为 False 而正常结束时执行。如果循环是因为执行了 break 语句而提前终止的,那么 else 子句将不会被执行。

3.1.1 while-else 的语法

while <条件表达式>:
    # 循环体
    if <某个中断条件>:
        break # 如果 break 执行,else 不会执行
else:
    # 只有当循环条件变为 False 自然结束时,才会执行这里的代码

3.1.2 应用场景与示例

while-else 结构常用于需要区分循环是“自然完成”还是“中途退出”的场景,例如搜索任务。

示例:使用 while-else 查找元素

items = ["apple", "banana", "orange"]
search_item = "grape"
index = 0

while index < len(items):
    if items[index] == search_item:
        print(f"Found '{search_item}' at index {index}.")
        break # 找到,跳出循环
    index += 1
else:
    # 只有当 while 循环完整执行完(没找到,条件 index < len(items) 变 False)时执行
    print(f"'{search_item}' not found in the list.")

print("-" * 20)

search_item = "banana"
index = 0
while index < len(items):
    if items[index] == search_item:
        print(f"Found '{search_item}' at index {index}.")
        break # 找到,跳出循环
    index += 1
else:
    print(f"'{search_item}' not found in the list.") # 这次不会打印,因为 break 执行了

代码解释:

  • 第一个 while 循环尝试查找 “grape”。由于列表中没有 “grape”,循环会一直执行直到 index 等于 3,此时 index < len(items) (即 3 < 3) 为 False,循环正常结束。因此,else 子句被执行,打印 “not found”。
  • 第二个 while 循环尝试查找 “banana”。当 index 为 1 时,items[1] == search_itemTrue,打印 “Found…”,然后 break 语句被执行,循环提前终止。由于循环是通过 break 结束的,else 子句被跳过,不会执行。

四、for 循环 vs while 循环:如何选择?

for 循环和 while 循环都是用来处理重复任务的,但它们的适用场景有所不同。

4.1 核心区别

  • for 循环: 更适用于迭代已知次数或遍历一个序列(如列表、元组、字符串、字典、集合)或任何可迭代对象。循环次数在开始时通常是确定的。
  • while 循环: 更适用于基于某个条件进行循环,而循环次数事先未知。循环的持续依赖于一个动态变化的条件。

4.2 选择场景举例

(1) 适合使用 for 循环的场景:
  • 遍历列表/元组/字符串中的每个元素。
    for char in "Python":
        print(char)
    
  • 执行固定次数的操作(结合 range())。
    for i in range(5): # 执行 5 次
        print(f"Iteration {i}")
    
  • 遍历字典的键、值或项。
    my_dict = {'a': 1, 'b': 2}
    for key, value in my_dict.items():
        print(f"{key} -> {value}")
    
(2) 适合使用 while 循环的场景:
  • 用户输入验证:反复要求用户输入,直到输入有效为止。
    while True:
        age_str = input("Enter your age: ")
        if age_str.isdigit():
            age = int(age_str)
            if 0 < age < 120:
                print("Valid age entered.")
                break # 输入有效,跳出循环
            else:
                print("Age must be between 1 and 119.")
        else:
            print("Invalid input. Please enter a number.")
    
  • 游戏主循环:游戏一直运行,直到玩家选择退出或游戏结束。
    game_over = False
    while not game_over:
        # 处理游戏逻辑...
        # 检查是否满足结束条件,若满足则设置 game_over = True
        pass # 占位符
    
  • 读取数据直到遇到结束标记。
    # 假设 read_data() 函数每次返回一行数据,遇到空行表示结束
    line = read_data()
    while line != "":
        process_data(line)
        line = read_data()
    

简单总结选择原则: 如果你知道要循环多少次或者要遍历一个集合,优先考虑 for 循环。如果循环的次数取决于某个运行时才能确定的条件,那么 while 循环通常是更好的选择。

五、总结

恭喜你,完成了 Python while 循环的学习!回顾一下本篇的核心知识点:

  1. while 循环基础: while 循环根据一个条件表达式 (TrueFalse) 来决定是否继续执行循环体代码。语法为 while condition: ...
  2. 工作流程: 先检查条件,若为 True 则执行循环体,然后再次检查条件,如此反复;若为 False 则结束循环。
  3. 避免死循环: 必须确保循环体内部有逻辑能让循环条件最终变为 False,否则会产生死循环。
  4. 循环控制:
    • break:立即、完全地终止整个循环。
    • continue:跳过当前迭代中 continue 之后的代码,进入下一次迭代的条件判断。
  5. while-else 结构: else 子句仅在 while 循环正常结束(条件变为 False)时执行,如果循环被 break 中断则不执行。
  6. for vs while for 适用于已知迭代次数或遍历序列,while 适用于基于条件、次数未知的循环。

while 循环是构建更复杂逻辑和算法的基础,例如实现用户交互、模拟事件、处理不确定长度的数据流等。熟练掌握 while 循环及其控制语句,将大大增强你编写灵活和强大程序的能力。继续练习,在实际问题中应用它们吧!下一篇我们将进入一个新的数据结构——列表(List)!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吴师兄大模型

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值