[指南] Python循环语句完全指南

Python循环语句完全指南

一、循环语句概述

循环是编程中用来重复执行特定代码块的结构。想象一下,如果你需要打印100个学生的名字,你不需要写100行print()语句,只需要一个循环就能完成。Python提供了两种主要的循环方式:for循环和while循环,它们适用于不同的场景,但目标相同------让代码重复执行。

二、for循环:遍历已知序列

作用和工作原理for循环用于遍历一个已知的序列(如列表、字符串、字典等),对序列中的每个元素执行相同的操作。它的工作原理是:从序列的第一个元素开始,依次取出每个元素,执行循环体内的代码,直到处理完所有元素。

基础for循环示例

python 复制代码
# 示例1:遍历列表
fruits = ["苹果", "香蕉", "橙子", "葡萄"]

# for循环结构:for 变量 in 序列:
# 每次循环,变量会被自动赋值为序列中的下一个元素
for fruit in fruits:  # 第一次循环fruit="苹果",第二次fruit="香蕉"...
    print(f"我喜欢吃 {fruit}")

print("\n遍历过程结束")

示例解释 :这个例子展示了最基本的for循环。我们有一个水果列表,for循环会依次取出列表中的每个水果,赋值给变量fruit,然后执行print语句。循环会执行4次,因为列表中有4个元素。

使用range()函数控制循环次数

python 复制代码
# 示例2:range()函数的三种用法
print("从0数到4:")
for i in range(5):  # range(5)生成0,1,2,3,4
    print(i, end=" ")

print("\n\n从2数到5:")
for i in range(2, 6):  # range(2,6)生成2,3,4,5
    print(i, end=" ")

print("\n\n从1到10的奇数:")
for i in range(1, 10, 2):  # 第三个参数是步长,这里是2
    print(i, end=" ")

示例解释range()函数不直接生成列表,而是生成一个可迭代的数字序列,这样可以节省内存。range(5)生成0-4共5个数字;range(2,6)生成从2开始到5结束的数字;range(1,10,2)从1开始,每次增加2,生成1,3,5,7,9。

遍历字典

python 复制代码
# 示例3:遍历字典的不同方式
student_scores = {"小明": 85, "小红": 92, "小刚": 78}

print("遍历字典的键:")
for name in student_scores:  # 默认遍历键
    print(f"学生: {name}")

print("\n遍历字典的值:")
for score in student_scores.values():  # 使用values()方法遍历值
    print(f"分数: {score}")

print("\n遍历键值对:")
for name, score in student_scores.items():  # items()返回键值对
    print(f"{name}的分数是{score}")

示例解释 :遍历字典时,默认遍历的是键。使用.values()可以遍历值,使用.items()可以同时获取键和值。注意.items()返回的是键值对元组,我们可以用两个变量分别接收键和值。

三、while循环:条件控制循环

作用和工作原理while循环在给定条件为真(True)时重复执行代码块。它不像for循环那样遍历序列,而是检查一个条件表达式,只要条件为真就继续执行循环。这适用于循环次数不确定的情况。

基础while循环

python 复制代码
# 示例4:计数器示例
counter = 1  # 初始化计数器
print("计数器从1数到5:")

# while循环结构:while 条件:
# 只要条件为True,就执行循环体
while counter <= 5:  # 当counter小于等于5时继续循环
    print(f"计数: {counter}")
    counter += 1  # 每次循环增加计数器值,避免无限循环

print("循环结束,counter现在是:", counter)

示例解释 :这个while循环会执行5次。关键是要在循环体内改变条件变量的值(这里是counter),否则如果条件一直为真,就会形成无限循环。counter += 1counter = counter + 1的简写形式。

while循环处理用户输入

python 复制代码
# 示例5:简单的密码验证
print("简单的密码验证系统")
password = ""  # 初始化为空字符串

# 当密码不等于"python123"时,继续循环
while password != "python123":
    password = input("请输入密码: ")
    if password != "python123":
        print("密码错误,请重试!")

print("登录成功!")

示例解释 :这个例子展示了while循环的一个常见用途------处理用户输入直到输入正确。只要用户输入的密码不是"python123",条件password != "python123"就为真,循环继续。当用户输入正确密码时,条件变为假,循环结束。

四、循环控制语句:break、continue、pass

作用和工作原理:这三个语句用于控制循环的执行流程:

  • break:立即终止整个循环,跳出循环体
  • continue:跳过本次循环的剩余代码,直接开始下一次循环
  • pass:什么都不做,只是一个占位符

break语句:提前退出循环

python 复制代码
# 示例6:使用break提前退出循环
print("查找1-100中第一个能被7整除的数:")

for num in range(1, 101):
    if num % 7 == 0:  # 如果num能被7整除
        print(f"找到第一个能被7整除的数: {num}")
        break  # 立即退出循环,不再检查后面的数字
    
    # break执行后,这行代码不会执行
    print(f"正在检查数字: {num}")

print("查找结束")

示例解释break语句会立即终止它所在的最近一层循环。在这个例子中,当找到第一个能被7整除的数(7)时,break立即执行,循环提前结束,不会继续检查8-100。

continue语句:跳过当前迭代

python 复制代码
# 示例7:使用continue跳过特定迭代
print("打印1-10之间的奇数:")

for num in range(1, 11):
    if num % 2 == 0:  # 如果num是偶数
        continue  # 跳过本次循环的剩余部分,直接开始下一次循环
    
    # 只有奇数会执行到这里
    print(num, end=" ")

print("\n\n处理完成")

示例解释 :当num是偶数时,continue语句执行,跳过print(num),直接开始下一次循环。只有奇数会执行到print语句。continue不会终止整个循环,只是跳过当前这一次迭代。

pass语句:什么都不做的占位符

python 复制代码
# 示例8:使用pass作为占位符
print("检查1-5的数字:")

for num in range(1, 6):
    if num == 3:
        pass  # 什么都不做,只是占位,让代码结构完整
        print(" (遇到了数字3,pass没有执行任何操作)")
    else:
        print(f"当前数字: {num}")

print("检查完成")

示例解释pass语句不做任何操作,只是语法上的占位符。当我们需要一个语句来保持代码结构完整,但又不希望执行任何操作时使用。在这个例子中,当num等于3时,什么操作都不做,然后继续执行后面的代码。

五、嵌套循环:循环中的循环

作用和工作原理:嵌套循环是指在一个循环内部包含另一个循环。外层循环每执行一次,内层循环会完整执行一遍。这常用于处理多维数据,如矩阵、表格等。

基本嵌套循环

python 复制代码
# 示例9:打印简单乘法表
print("简单乘法表(1-3):")

for i in range(1, 4):  # 外层循环,控制行
    for j in range(1, 4):  # 内层循环,控制列
        print(f"{i}×{j}={i*j}", end="  ")
    print()  # 每行结束后换行

print("\n外层循环执行3次,内层循环执行9次(3×3)")

示例解释 :外层循环i从1到3,内层循环j也从1到3。当i=1时,内层循环完整执行一遍(j=1,2,3),输出第一行。然后i=2,内层循环再完整执行一遍,输出第二行,以此类推。

处理二维数据

python 复制代码
# 示例10:处理二维列表(矩阵)
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

print("矩阵的行和列:")
for row in matrix:  # 外层循环遍历行
    for element in row:  # 内层循环遍历每行中的元素
        print(element, end=" ")
    print()  # 每行结束后换行

示例解释matrix是一个二维列表(列表的列表)。外层循环遍历每一行,内层循环遍历当前行的每个元素。这种嵌套循环结构非常适合处理表格型数据。

六、循环中的else子句

作用和工作原理 :Python的循环可以有一个else子句,它在循环正常结束后执行(即不是被break语句中断的)。如果循环被break终止,else子句不会执行。

for循环中的else子句

python 复制代码
# 示例11:for循环的else子句
print("检查列表中是否包含负数:")

numbers = [2, 4, 6, 8, 10]

for num in numbers:
    if num < 0:
        print(f"发现负数: {num}")
        break
else:
    # 只有在循环正常结束时才执行(没有遇到break)
    print("列表中没有负数")

print("\n另一个例子:")
numbers = [2, 4, -1, 6, 8]

for num in numbers:
    if num < 0:
        print(f"发现负数: {num}")
        break
else:
    # 这个else不会执行,因为循环被break中断了
    print("这行不会执行")

示例解释 :第一个循环中,所有数字都是正数,循环正常结束(没有遇到break),所以执行else子句。第二个循环中,遇到负数-1时执行了break,循环被提前终止,所以else子句不会执行。

while循环中的else子句

python 复制代码
# 示例12:while循环的else子句
print("猜数字游戏(最多尝试3次):")

secret_number = 7
attempts = 0

while attempts < 3:
    guess = int(input("请输入1-10之间的数字: "))
    attempts += 1
    
    if guess == secret_number:
        print(f"恭喜!你在第{attempts}次猜对了!")
        break
else:
    # 如果while循环正常结束(没有遇到break),执行这里
    print(f"很遗憾,你没有在3次内猜中。正确答案是{secret_number}")

示例解释 :这个while循环允许最多尝试3次。如果用户猜对了,执行breakelse子句不会执行。如果3次尝试都用完了还没猜对,循环正常结束,执行else子句。

七、辅助函数:enumerate()和zip()

作用和工作原理:Python提供了一些内置函数来增强循环的功能:

  • enumerate():在遍历序列时同时获取索引和元素
  • zip():同时遍历多个序列

enumerate()函数:获取索引和元素

python 复制代码
# 示例13:使用enumerate()同时获取索引和值
fruits = ["苹果", "香蕉", "橙子", "葡萄"]

print("带索引的水果列表:")
# enumerate()返回(索引, 元素)对
for index, fruit in enumerate(fruits):
    print(f"{index}: {fruit}")

print("\n从1开始计数:")
for index, fruit in enumerate(fruits, start=1):
    print(f"第{index}个水果: {fruit}")

示例解释enumerate()函数在循环中非常有用,它返回一个包含索引和值的元组。通过start参数可以指定起始索引值,默认为0。这样可以避免手动维护计数器变量。

zip()函数:并行遍历多个序列

python 复制代码
# 示例14:使用zip()同时遍历多个列表
names = ["小明", "小红", "小刚"]
scores = [85, 92, 78]
subjects = ["数学", "英语", "物理"]

print("学生成绩单:")
# zip()将多个序列对应位置的元素打包成元组
for name, score, subject in zip(names, scores, subjects):
    print(f"{name}在{subject}考试中得了{score}分")

print("\n注意:当序列长度不同时,zip()以最短的为准")

示例解释zip()函数将多个序列中相同位置的元素组合成元组。当序列长度不同时,zip()会在最短的序列用完后停止。这在需要同时处理多个相关列表时非常方便。

八、列表推导式:循环的简洁写法

作用和工作原理 :列表推导式提供了一种简洁的创建列表的方法,它本质上是for循环的一种简写形式,但可读性更强,执行效率也通常更高。

基础列表推导式

python 复制代码
# 示例15:用列表推导式创建平方数列表
# 传统方法
squares = []
for x in range(1, 6):
    squares.append(x ** 2)
print(f"传统方法: {squares}")

# 列表推导式
squares = [x ** 2 for x in range(1, 6)]
print(f"列表推导式: {squares}")

print("\n带条件的列表推导式:")
# 只包含偶数的平方
even_squares = [x ** 2 for x in range(1, 11) if x % 2 == 0]
print(f"1-10中偶数的平方: {even_squares}")

示例解释 :列表推导式的语法是[表达式 for 变量 in 序列],它相当于一个简化的for循环。[x ** 2 for x in range(1, 6)]会创建一个列表,包含1-5的平方。带条件的列表推导式可以在后面添加if条件来过滤元素。

嵌套循环的列表推导式

python 复制代码
# 示例16:嵌套循环的列表推导式
print("所有可能的坐标对:")
# 传统嵌套循环
coords = []
for x in range(1, 4):
    for y in range(1, 4):
        coords.append((x, y))
print(f"传统方法: {coords}")

# 列表推导式
coords = [(x, y) for x in range(1, 4) for y in range(1, 4)]
print(f"列表推导式: {coords}")

print("\n字典推导式:")
# 创建数字平方的字典
square_dict = {x: x ** 2 for x in range(1, 6)}
print(f"数字平方字典: {square_dict}")

示例解释 :列表推导式也可以处理嵌套循环,语法是[表达式 for 变量1 in 序列1 for 变量2 in 序列2]。字典推导式的语法类似,但使用花括号和键值对格式。

九、综合实战:学生成绩分析系统

场景描述:我们需要分析一个班级学生的成绩数据,计算每个学生的平均分、最高分和最低分,并找出所有科目都及格的学生。

python 复制代码
# 示例17:学生成绩分析系统
print("=== 学生成绩分析系统 ===")

# 学生成绩数据(字典嵌套列表)
students = {
    "张三": [85, 90, 78],  # 语文、数学、英语
    "李四": [92, 88, 95],
    "王五": [76, 82, 80],
    "赵六": [88, 90, 92]
}

print("1. 计算每个学生的平均分、最高分和最低分")
print("-" * 50)

# 外层循环:遍历每个学生
for name, scores in students.items():
    # 初始化统计变量
    total = 0
    highest = scores[0]
    lowest = scores[0]
    
    # 内层循环:分析该学生的各科成绩
    for score in scores:
        total += score  # 累加总分
        if score > highest:
            highest = score  # 更新最高分
        if score < lowest:
            lowest = score  # 更新最低分
    
    average = total / len(scores)  # 计算平均分
    
    # 输出结果
    print(f"学生: {name}")
    print(f"  成绩: {scores}")
    print(f"  平均分: {average:.2f}")
    print(f"  最高分: {highest}")
    print(f"  最低分: {lowest}")
    print("-" * 30)

print("\n2. 找出所有科目都及格(≥60)的学生")
all_pass_students = []

# 遍历每个学生
for name, scores in students.items():
    # 检查是否所有科目都及格
    all_pass = True  # 假设都及格
    
    for score in scores:
        if score < 60:  # 如果有一科不及格
            all_pass = False
            break  # 不需要检查其他科目了
    
    if all_pass:
        all_pass_students.append(name)

if all_pass_students:
    print(f"所有科目都及格的学生: {', '.join(all_pass_students)}")
else:
    print("没有学生所有科目都及格")

print("\n3. 使用列表推导式找出数学成绩优秀(≥85)的学生")
# 假设第一个成绩是语文,第二个是数学,第三个是英语
math_excellent = [name for name, scores in students.items() if scores[1] >= 85]
print(f"数学成绩优秀的学生: {', '.join(math_excellent)}")

示例解释:这个综合示例展示了多种循环技巧的结合使用:

  1. 使用嵌套循环处理二维数据(学生和他们的各科成绩)
  2. 在循环中计算统计值(总分、最高分、最低分、平均分)
  3. 使用break提前退出循环(当发现不及格科目时)
  4. 使用列表推导式进行条件筛选
  5. 使用.items()遍历字典的键值对

十、常见错误和最佳实践

常见错误

  1. 无限循环 :忘记在while循环中更新条件变量
  2. 修改正在遍历的列表:在循环中直接删除或添加元素
  3. 混淆break和continue:用错这两个控制语句

避免常见错误

python 复制代码
# 示例18:避免常见错误
print("=== 常见错误和正确做法 ===")

print("1. 错误:在迭代过程中修改列表")
fruits = ["apple", "banana", "cherry"]
print("原列表:", fruits)

# 错误做法:在循环中直接删除元素
# for fruit in fruits:
#     if fruit == "banana":
#         fruits.remove(fruit)  # 这会改变列表长度,可能导致意外行为

print("\n正确做法:创建新列表或先记录要删除的元素")
fruits = ["apple", "banana", "cherry"]
fruits_to_keep = []

for fruit in fruits:
    if fruit != "banana":  # 保留不是"banana"的水果
        fruits_to_keep.append(fruit)

fruits = fruits_to_keep  # 用新列表替换原列表
print("处理后:", fruits)

print("\n2. 错误:忘记更新while循环的条件变量")
# 错误做法:可能导致无限循环
# count = 0
# while count < 5:
#     print(count)  # 忘记写 count += 1

print("\n正确做法:确保条件会改变")
count = 0
while count < 5:
    print(count, end=" ")
    count += 1  # 重要:更新条件变量

print("\n\n3. 最佳实践:使用enumerate()代替手动计数")
colors = ["red", "green", "blue"]

print("不推荐:手动维护索引")
index = 0
for color in colors:
    print(f"{index}: {color}")
    index += 1

print("\n推荐:使用enumerate()")
for index, color in enumerate(colors):
    print(f"{index}: {color}")

print("\n4. 最佳实践:考虑使用列表推导式简化代码")
print("不推荐:创建新列表的传统循环")
numbers = [1, 2, 3, 4, 5]
squares = []
for num in numbers:
    squares.append(num ** 2)

print("\n推荐:使用列表推导式")
squares = [num ** 2 for num in numbers]
print(f"平方数列表: {squares}")

最佳实践总结

  1. 对于遍历序列,优先使用for循环而不是while循环
  2. 避免在循环中直接修改正在遍历的序列
  3. 使用enumerate()获取索引,而不是手动维护计数器
  4. 对于简单的列表创建和转换,考虑使用列表推导式
  5. 确保while循环的条件最终会变为假,避免无限循环

总结

Python的循环结构提供了强大的重复执行代码的能力。for循环适合遍历已知序列,while循环适合基于条件的重复执行。通过breakcontinuepass可以更精细地控制循环流程。嵌套循环允许处理多维数据,而列表推导式提供了更简洁的循环写法。

记住:循环是编程中最常用的结构之一,掌握好循环是成为熟练Python程序员的关键。最好的学习方法是多练习,尝试用不同的循环方式解决同一问题,理解它们各自的适用场景。


研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)


相关推荐
chilavert3181 小时前
技术演进中的开发沉思-368:锁机制(中)
java·开发语言·jvm
Evand J2 小时前
【Python代码例程】长短期记忆网络(LSTM)和无迹卡尔曼滤波(UKF)的结合,处理复杂非线性系统和时间序列数据
python·lstm·滤波
大黄说说2 小时前
MySQL数据库运维管理基础知识:从安装到日常维护的完整指南
开发语言
HAPPY酷2 小时前
C++ 多线程实战三板斧
java·开发语言·c++·技术美术
独自破碎E2 小时前
BISHI54货物堆放
android·java·开发语言
workflower3 小时前
易用性和人性化需求
java·python·测试用例·需求分析·big data·软件需求
嚯嚯歪3 小时前
攻克腾讯 TCaptcha 滑块验证码:纯 HTTP 协议逆向实战
爬虫·python·逆向·验证码识别
じ☆冷颜〃3 小时前
随机微分层论:统一代数、拓扑与分析框架下的SPDE论述
笔记·python·学习·线性代数·拓扑学
顾北123 小时前
SpringCloud 系列 04:Gateway 断言 / 过滤器 / 限流 一站式落地指南
java·开发语言·数据库