杰瑞科技汇

Python while和for循环该怎么选?

  1. 核心思想:它们各自的设计初衷是什么?
  2. 语法结构:如何书写这两种循环?
  3. 工作原理:它们是如何执行的?
  4. 使用场景:在什么情况下应该用哪个?
  5. 关键区别总结:一张图看懂所有不同。
  6. 进阶用法break, continue, else 子句。
  7. 综合示例

核心思想

  • while 循环: “当...时,就...”

    Python while和for循环该怎么选?-图1
    (图片来源网络,侵删)
    • 它是一个条件控制的循环,只要给定的条件为 True,循环体内的代码就会一直重复执行,一旦条件变为 False,循环立即终止。
    • 你在开始循环时,可能不知道具体要执行多少次。
  • for 循环: “对于...中的每一个...,就...”

    • 它是一个迭代(Iteration)循环,它专门用于遍历任何可迭代对象(如列表、元组、字符串、字典等)中的每一个元素。
    • 你在开始循环时,确切地知道要遍历的元素数量,循环的次数是确定的。

语法结构

while 循环语法

while 条件:
    # 循环体
    # 当条件为 True 时,会执行这里的代码
    # 注意:循环体内必须有能让条件最终变为 False 的逻辑,否则会无限循环

for 循环语法

for 变量 in 可迭代对象:
    # 循环体
    # 对于可迭代对象中的每一个元素,都会将其赋值给变量,并执行这里的代码

工作原理

while 循环工作原理

  1. 判断条件:程序会检查 while 后面的条件表达式。
  2. 条件为 True:如果条件为 True,则执行 while 循环体内的代码块。
  3. 循环与重判:执行完代码块后,程序会回到第1步,再次判断条件,只要条件一直为 True,这个过程就会重复。
  4. 条件为 False:当某次判断条件结果为 False 时,循环终止,程序会跳过循环体,执行 while 循环之后的代码。

⚠️ 重要警告:无限循环 while 循环的条件永远无法变为 False,就会形成无限循环,程序将无法正常结束,在编写 while 循环时,必须确保循环体内有能够改变条件、使其最终变为 False 的代码。

for 循环工作原理

  1. 获取可迭代对象for 循环会获取它后面的可迭代对象(比如一个列表 my_list = [1, 2, 3])。
  2. 取出第一个元素:从该对象中取出第一个元素(1),并将其赋值给循环变量(item)。
  3. 执行循环体:执行一次循环体内的代码。
  4. 取出下一个元素:执行完毕后,再从可迭代对象中取出下一个元素(2),赋值给循环变量。
  5. 重复执行:重复第3、4步,直到可迭代对象中的所有元素都被遍历过一次。
  6. 循环结束:当所有元素都遍历完后,for 循环自动结束,程序继续执行循环之后的代码。

使用场景

场景描述 推荐循环 原因
遍历一个序列(如列表、字符串、元组等) for 循环 for 循环为此而生,代码更简洁、更 Pythonic。
执行固定次数 for 循环 配合 range() 函数使用,非常方便。
当某个条件满足时才执行,且不确定次数 while 循环 等待用户输入正确密码、游戏中的主循环、读取数据直到文件末尾。
需要手动控制循环变量 while 循环 你可以在循环体内自由地修改循环变量,以实现复杂的控制逻辑。

关键区别总结

特性 while 循环 for 循环
控制方式 基于条件(布尔值) 基于迭代(遍历序列)
执行次数 不确定(可能为0次、1次或无数次) 确定(等于可迭代对象的元素个数)
循环变量 需要手动初始化更新 自动从可迭代对象中获取和赋值
典型用途 事件驱动、等待条件、无限循环 遍历数据、固定次数操作
风险 容易造成无限循环 不易造成无限循环

进阶用法

break 语句

用于立即终止当前所在的循环,无论条件是否满足或是否还有元素未遍历。

# while break
count = 0
while True:
    print(f"Count is {count}")
    count += 1
    if count == 5:
        break  # 当 count 等于 5 时,跳出循环
# for break
fruits = ["apple", "banana", "cherry", "orange"]
for fruit in fruits:
    if fruit == "cherry":
        break  # 遇到 "cherry" 时,停止遍历
    print(fruit)
# 输出:
# apple
# banana

continue 语句

用于跳过当前循环的剩余部分,直接进入下一次循环的判断或迭代。

Python while和for循环该怎么选?-图2
(图片来源网络,侵删)
# while continue
count = 0
while count < 5:
    count += 1
    if count == 3:
        continue  # 当 count 等于 3 时,跳过下面的 print,直接进入下一次循环
    print(f"Count is {count}")
# for continue
fruits = ["apple", "banana", "cherry", "orange"]
for fruit in fruits:
    if fruit == "cherry":
        continue  # 遇到 "cherry" 时,跳过下面的 print,继续遍历下一个
    print(fruit)
# 输出:
# Count is 1
# Count is 2
# Count is 4
# Count is 5
# apple
# banana
# orange

else 子句

循环结构可以有一个 else 子句,这个 else 块会在循环正常结束(即没有被 break 语句中断)时执行。

# while-else
count = 0
while count < 3:
    print(f"Count is {count}")
    count += 1
else:
    print("While loop finished normally.") # 循环条件变为 False,正常结束,所以执行 else
# for-else
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)
    if fruit == "durian": # 这个条件永远不会满足
        break
else:
    print("For loop finished normally.") # 循环遍历完所有元素,正常结束,所以执行 else
# --- break 的情况 ---
print("\n--- With break ---")
for fruit in fruits:
    print(fruit)
    if fruit == "banana":
        break # 遇到 break,循环被中断
else:
    # 这里的代码不会被执行,因为循环被 break 打断了
    print("This line will not be printed.")

综合示例

示例1:猜数字游戏 (适合 while)

我们不知道用户会猜几次,所以用 while 循环最合适。

import random
# 生成一个 1 到 100 之间的随机数
target_number = random.randint(1, 100)
guess = -1 # 初始化一个不等于 target_number 的值
print("欢迎来到猜数字游戏!我已经想好了一个 1 到 100 之间的数字。")
# 当 guess 不等于目标数字时,一直循环
while guess != target_number:
    try:
        # 获取用户输入
        guess_str = input("请输入你猜的数字: ")
        guess = int(guess_str)
        # 判断大小
        if guess < target_number:
            print("太小了!再试一次。")
        elif guess > target_number:
            print("太大了!再试一次。")
        else:
            print(f"恭喜你!猜对了!数字就是 {target_number}!")
    except ValueError:
        print("输入无效,请输入一个整数。")
print("游戏结束。")

示例2:计算列表中所有数字的总和 (适合 for)

我们知道要遍历列表中的每一个元素,所以用 for 循环。

numbers = [10, 20, 30, 40, 50]
total_sum = 0
# 遍历 numbers 列表中的每一个元素
for number in numbers:
    total_sum += number # 将每个数字加到总和中
print(f"列表 {numbers} 中所有数字的总和是: {total_sum}")

示例3:使用 range()for 循环

如果需要执行固定次数的循环,for 循环配合 range() 是最佳选择。

# 打印 0 到 4 (不包括 5)
print("打印 0 到 4:")
for i in range(5):
    print(i)
# 打印 2 到 8 (不包括 9),步长为 2
print("\n打印 2 到 8,步长为 2:")
for i in range(2, 9, 2):
    print(i)
# 从 10 倒数到 1
print("\n从 10 倒数到 1:")
for i in range(10, 0, -1):
    print(i)
  • 想想你的循环是“基于条件”还是“基于遍历”
  • 如果不确定次数,等待某个条件发生,用 while
  • 如果要遍历一个明确的序列或执行固定次数,用 for
  • 熟练掌握 breakcontinueelse 子句,能让你的循环逻辑更加健壮和灵活。
分享:
扫描分享到社交APP
上一篇
下一篇