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

一文读懂 Python 【循环语句】:从基础到实战,效率提升指南

文章目录

    • 一、为什么需要循环?先看一个真实场景
    • 二、Python 循环的 “两大支柱”:for 循环与 while 循环
  • (一)for 循环:“逐个遍历” 的高效工具
  • 变量名:
  • (二)while 循环:“满足条件就继续” 的灵活选择
  • 第六种方法:使用递归
  • 三、循环控制:让循环更 “聪明”(break/continue/pass)
    • (一)break:直接终止整个循环
    • (二)continue:跳过当前次循环,继续下一次
    • (三)pass:占位符,让代码 “不报错”
  • 四、进阶技巧:让循环更高效、更简洁
    • (一)循环嵌套:“循环里套循环”
    • (二)列表推导式:用一行代码实现 “循环 + 列表创建”
    • (三)循环中的 else 语句:“正常结束循环时执行”
  • 五、常见坑点与避坑指南
  • 六、总结:该用 for 还是 while?

Python 编程世界里,重复执行某段代码是极为常见的需求 —— 比如遍历列表里的所有数据、反复验证用户输入、批量处理文件等。如果每次重复都手动复制代码,不仅效率低下,还会让代码变得臃肿杂乱。而循环语句,就是解决 “重复执行” 问题的 “金钥匙”。今天,我们就从基础到进阶,全面拆解 Python 中最核心的两种循环:for循环和while循环,再结合实战案例,教你如何用循环提升代码效率,避开常见坑点。

一、为什么需要循环?先看一个真实场景

假设你是一名数据分析师,需要计算一个包含 100 个数值的列表总和。如果不用循环,你可能会写出这样的
代码:

nums = [1,2,3,...,100]  
# 共100个数字total = 0
total += nums[0]
total += nums[1]
total += nums[2]
# ... 还要写97行类似代码print(total)
print(total)   

这显然不现实 —— 不仅要写 100 行重复代码,万一列表长度变成 1000,代码量还得翻倍。而用循环,只需 3 行核心代码就能搞定:

nums = [1,2,3,...,100]
total = 0for num in nums:  # 循环遍历列表
total += num
print(total)  # 直接输出结果
这就是循环的价值:用固定代码,处理任意长度的重复任务,让代码更简洁、灵活、易维护。

这就是循环的价值:用固定代码,处理任意长度的重复任务,让代码更简洁、灵活、易维护。

二、Python 循环的 “两大支柱”:for 循环与 while 循环

Python 中只有两种核心循环结构,但能覆盖 99% 的重复场景。我们先从最常用的for循环讲起。

(一)for 循环:“逐个遍历” 的高效工具

for循环的核心逻辑是 “遍历可迭代对象”—— 比如列表、元组、字符串、字典等,依次取出其中的每个元素,执行对应的代码块。

  1. 基础语法

代码:

for 变量名 in 可迭代对象:
# 循环体:每次遍历要执行的代码(注意缩进!)
代码语句1
代码语句2
# 循环结束后执行的代码(无缩进)

变量名:

每次遍历从 “可迭代对象” 中取出的元素,会赋值给这个变量(比如遍历列表时,变量就是列表里的每个元素)。

  • 可迭代对象:能依次取出元素的对象,常见的有列表、字符串、range ()、字典等。
  • 代码:缩进:Python 通过缩进区分代码块,循环体必须缩进(通常是 4 个空格),否则会报错。
  1. 最常用的 3 种场景

场景 1:遍历列表 / 元组 / 字符串
这是for循环最基础的用法,直接依次取出每个元素:

 # 1. 遍历列表(计算所有水果的长度)fruits = ["apple", "banana", "cherry"]for fruit in fruits:
print(f"水果{fruit}的长度是:{len(fruit)}")
# 2. 遍历字符串(打印每个字符)
text = "Python"
for char in text:
print(char, end=" ")  # 输出:P y t h o n
# 3. 遍历元组(统计偶数)
nums = (1,2,3,4,5,6)
even_count = 0
for num in nums:
if num % 2 == 0:
even_count += 1
print(f"元组中的偶数有{even_count}个")  # 输出:3

场景 2:用 range () 生成 “数字序列”如果需要按 “数字顺序” 循环(比如循环 10 次、从 5 到 15 循环),可以用range()函数生成指定范围的数字序列。range()的 3 种用法:

  • range(n):生成 0 到 n-1 的整数(比如 range (5) → 0,1,2,3,4)
  • range(start, end):生成 start 到 end-1 的整数(比如 range (2,6) → 2,3,4,5)
  • range(start, end, step):生成 start 到 end-1 的整数,步长为 step(比如 range
    (1,10,2) → 1,3,5,7,9)

实战案例:循环 10 次,打印 “第 n 次循环”:
代码:

for i in range(1, 11):  # 从1到10(含10)
print(f"这是第{i}次循环")

场景 3:遍历字典(3 种方式)
字典是 “键值对” 结构,遍历方式和列表不同,需要区分 “遍历键”“遍历值”“遍历键值对”:

student = {"name": "小明", "age": 18, "score": 95}
# 1. 遍历字典的键(默认方式)
for key in student:
print(f"键:{key}")  # 输出:name, age, score
# 2. 遍历字典的值(用.values())
for value in student.values():
print(f"值:{value}")  # 输出:小明, 18, 95
# 3. 遍历键值对(用.items(),最常用)
for key, value in student.items():
print(f"{key}{value}")  # 输出:name:小明,age:18,score:95

(二)while 循环:“满足条件就继续” 的灵活选择

while循环的核心逻辑是 “只要条件成立,就重复执行代码块”—— 直到条件不成立时,循环才会停止。适合场景:不确定循环次数,但知道 “循环停止的条件”(比如等待用户输入正确密码、直到某个变量达到目标值)。

  1. 基础语法while 条件表达式

第六种方法:使用递归

代码:

# 循环体:条件成立时执行的代码(需缩进)
代码语句1
代码语句2
# (可选)更新条件相关的变量(避免死循环!)
  • 条件表达式:每次循环前会判断这个表达式的结果(True/False)。如果是 True,执行循环体;如果是 False,退出循环。
  • 关键提醒:循环体中必须有 “更新条件” 的代码(比如让变量自增、修改判断值),否则条件会一直成立,导致 “死循环”(代码永远执行下去,只能强制关闭程序)。
  1. 经典实战案例
  2. 案例 1:直到用户输入正确密码才停止

代码

# 正确密码
correct_password = "123456"
# 循环获取用户输入,直到正确
while True:  # 先让循环“无限进行”
password = input("请输入密码:")
if password == correct_password:
print("密码正确,欢迎登录!")
break  # 密码正确,退出循环(break后面讲)
else:
print("密码错误,请重新输入!")

案例 2:计算 1 到 100 的总和(用 while 实现)

total = 0
i = 1  # 初始值
while i <= 100:  # 条件:i不大于100
total += i
i += 1  # 关键:更新i的值(否则i一直是1,死循环)
print(f"1到100的总和是:{total}")  # 输出:5050

案例 3:避免死循环的 “安全写法”如果担心条件判断失误导致死循环,可以加一个 “最大循环次数” 限制:

count = 0  # 记录循环次数
max_count = 3  # 最大允许3次
while count < max_count:
password = input("请输入密码(最多3次机会):")
if password == "123456":
print("登录成功!")
break
else:
count += 1
remaining = max_count -
countprint(f"密码错误,还剩{remaining}次机会")
else:
# 循环正常结束(没触发break)时执行
print("3次密码错误,账号已锁定!")

三、循环控制:让循环更 “聪明”(break/continue/pass)

有时候,我们需要在循环中 “提前退出”“跳过某次循环” 或 “占位”,这就需要用到 3 个控制语句:break、continue、pass

(一)break:直接终止整个循环

break的作用是 “立即退出当前所在的循环”,不管循环条件是否还成立。一旦执行break,循环体中break后面的代码不会执行,直接跳到循环外。
案例:遍历列表,找到 “banana” 就停止:

fruits = ["apple", "banana", "cherry", "date"]
for fruit in fruits:
if fruit == "banana":
print(f"找到目标水果:{fruit}")
break  # 找到后立即退出循环
print(f"当前遍历的水果:{fruit}")
# 输出结果:
# 当前遍历的水果:apple
# 找到目标水果:banana

可以看到,循环在找到 “banana” 后就停止了,没有继续遍历 “cherry” 和 “date”。

(二)continue:跳过当前次循环,继续下一次

continue的作用是 “跳过当前次循环的剩余代码,直接开始下一次循环”—— 不会终止整个循环,只是跳过当前这一轮。
案例:遍历 1 到 10,只打印奇数(跳过偶数):

for i in range(1, 11):
if i % 2 == 0:  # 如果是偶数
continue  # 跳过当前次循环的剩余代码
print(i)  # 只有奇数会执行这行
# 输出:1 3 5 7 9

当i是偶数时,continue会跳过print(i),直接进入下一次循环;只有奇数会执行print(i)。

(三)pass:占位符,让代码 “不报错”

pass是一个 “空语句”,没有实际功能,仅用于 “占位”—— 比如当你暂时没想好循环体写什么,又不想代码报错时,就可以用pass。

案例:先搭好循环结构,后续再补逻辑:

for i in range(5):
#  TODO:后续要实现的逻辑
pass  # 占位,避免语法错误
while i < 10:
#  TODO:待完善
pass

四、进阶技巧:让循环更高效、更简洁

掌握基础后,这些进阶技巧能帮你写出更优雅的循环代码。

(一)循环嵌套:“循环里套循环”

当需要处理 “多层结构” 的数据(比如二维列表、表格)时,可以用 “循环嵌套”—— 外层循环控制 “行”,内层循环控制 “列”。

案例:打印一个 3x3 的乘法表:

# 外层循环:控制行数(1到3)
for i in range(1, 4):
# 内层循环:控制每行的列数(1到i)
for j in range(1, i+1):
print(f"{j}×{i}={i*j}", end="\t")  # \t是制表符,让格式对齐
print()  # 每行结束后换行
# 输出结果:
# 1×1=1
# 1×2=2        2×2=4
# 1×3=3        2×3=6        3×3=9

(二)列表推导式:用一行代码实现 “循环 + 列表创建”

如果循环的目的是 “生成一个新列表”,可以用列表推导式替代传统的for循环,代码更简洁,执行效率也更高。

基础语法
新列表 = [表达式 for 变量 in 可迭代对象 if 条件]
等价于:
新列表 = []
for 变量 in 可迭代对象:
if 条件:
新列表.append(表达式)
实战案例

# 案例1:生成1到10的平方列表(传统循环vs列表推导式)
# 传统循环
squares = []
for i in range(1, 11):
squares.append(i**2)
# 列表推导式(一行搞定)
squares = [i**2 for i in range(1, 11)]
print(squares)  # 输出:[1,4,9,...,100]
# 案例2:筛选列表中的偶数(加条件)
nums = [1,2,3,4,5,6,7,8]
even_nums = [num for num in nums if num % 2 == 0]
print(even_nums)  # 输出:[2,4,6,8]
# 案例3:嵌套循环(生成所有组合)
a = [1,2]
b = ["x","y"]
combinations = [f"{x}_{y}" for x in a for y in b]
print(combinations)  # 输出:["1_x", "1_y", "2_x", "2_y"]

(三)循环中的 else 语句:“正常结束循环时执行”

Python 的循环(for/while)都支持搭配else语句 ——当循环 “正常结束”(没有被break终止)时,会执行else里的代码。

案例:检查列表中是否有 “负数”,没有则打印提示:

nums = [1,3,5,7]
for num in nums:
if num < 0:
print("列表中存在负数")
break
else:
# 只有当循环没被break终止时,才会执行
print("列表中没有负数")  # 输出:列表中没有负数

五、常见坑点与避坑指南

  1. 死循环:最常见的错误!
    原因:while循环中没有更新条件变量(比如i一直不变),或条件永远为 True(比如while 1:)。
    解决:每次写while循环时,先检查 “是否有更新条件的代码”;测试时如果卡住,按Ctrl+C强制终止。
  2. 缩进错误:Python 的缩进是语法的一部分!
    原因:循环体没有缩进,或缩进不一致(有的用 4 空格,有的用 Tab)。
    解决:统一用 4 个空格缩进;IDE(如 PyCharm、VS Code)会自动帮你对齐,避免手动调整。
  3. 遍历字典时修改字典:直接在遍历中删除 / 添加键值对会报错!
    原因:字典在遍历过程中不能修改 “大小”(即不能增删键)。
    解决:先遍历字典的 “副本”(比如for key in list(student.keys()):),再修改原字典。
  4. range () 的 “左闭右开” 特性:容易误解范围!
    比如range(1,5)生成的是 1,2,3,4(不含 5),不是 1-5。
    解决:记住 “end 参数要比目标值大 1”,比如要到 5,就写range(1,6)。

六、总结:该用 for 还是 while?

很多场景下,for和while可以互相替代,但选择合适的循环能让代码更易读:

在这里插入图片描述

最后,记住一句话:循环的本质是 “减少重复代码”。写循环时,先想清楚 “要重复做什么”“什么时候停止”,再选择合适的循环结构 —— 多练几个案例(比如批量处理文件、统计数据),很快就能熟练掌握!如果觉得这篇文章有用,欢迎点赞、在看,分享给身边学 Python 的朋友~ 有任何疑问,也可以在评论区留言交流哦!

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

相关文章:

  • 【机器学习学习笔记】Matplotlib 基本操作
  • Java 大视界 --Java 大数据在智能教育学习资源整合与知识图谱构建中的深度应用(406)
  • 如何将大疆无人机拍摄到的图像回传到应急指挥中心大屏?5G单兵图传轻松解决图传问题|伟博视讯
  • Ansible角色:高效开发与管理的秘密
  • Ukey介绍
  • HTML第二课:块级元素
  • 【3D 入门-3】常见 3D 格式对比,.glb / .obj / .stl / .ply
  • Ascend上开发自定义算子接入PyTorch有几种实现方式?
  • Higress云原生API网关详解 与 Linux版本安装指南
  • 企业数字安全守护神:IT运维管理系统全面解析,构建坚不可摧的防护体系
  • 实现自己的AI视频监控系统-第三章-信息的推送与共享3(重点)
  • 数据结构:闭散列 (Closed Hashing)-开放定址法 (Open Addressing)
  • react用useImages读取图片,方便backgroundImage
  • hikvision海康威视sdk调用失败,code为29解决办法
  • 集采与反腐双重压力下,医药销售的破局之道:从资源依赖到价值重构
  • 从结构化到多模态:RAG文档解析工具选型全指南
  • Portainer:Docker可视化管理神器部署与使用攻略
  • 不只是一台玩具车:开源燃料电池机器人HydroBot全揭秘
  • 怎么用redis lua脚本实现各分布式锁?Redisson各分布式锁怎么实现的?
  • Unity通过Object学习原型模式
  • ES6和CommonJS模块区别
  • GNU Make | C/C++项目自动构建入门
  • DevOps运维与开发一体化及Kubernetes运维核心详解
  • Aurobay EDI 需求分析:OFTP2 与 EDIFACT 驱动的汽车供应链数字化
  • DataAgent技术解析:数据智能的未来之路
  • LangGraph 上下文工程权威指南:构建智能、感知、有记忆的 AI 代理
  • Ubuntu平台查看.gz格式压缩文件内容以及利用grep命令过滤搜索内容
  • 《浪浪山小妖怪》知识竞赛来袭!测测你是几级影迷?
  • RL【1】:Basic Concepts
  • 情况三:已经 add ,并且也 commit 了