一文读懂 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循环的核心逻辑是 “遍历可迭代对象”—— 比如列表、元组、字符串、字典等,依次取出其中的每个元素,执行对应的代码块。
- 基础语法
代码:
for 变量名 in 可迭代对象:
# 循环体:每次遍历要执行的代码(注意缩进!)
代码语句1
代码语句2
# 循环结束后执行的代码(无缩进)
变量名:
每次遍历从 “可迭代对象” 中取出的元素,会赋值给这个变量(比如遍历列表时,变量就是列表里的每个元素)。
- 可迭代对象:能依次取出元素的对象,常见的有列表、字符串、range ()、字典等。
- 代码:缩进:Python 通过缩进区分代码块,循环体必须缩进(通常是 4 个空格),否则会报错。
- 最常用的 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循环的核心逻辑是 “只要条件成立,就重复执行代码块”—— 直到条件不成立时,循环才会停止。适合场景:不确定循环次数,但知道 “循环停止的条件”(比如等待用户输入正确密码、直到某个变量达到目标值)。
- 基础语法while 条件表达式
第六种方法:使用递归
代码:
# 循环体:条件成立时执行的代码(需缩进)
代码语句1
代码语句2
# (可选)更新条件相关的变量(避免死循环!)
- 条件表达式:每次循环前会判断这个表达式的结果(True/False)。如果是 True,执行循环体;如果是 False,退出循环。
- 关键提醒:循环体中必须有 “更新条件” 的代码(比如让变量自增、修改判断值),否则条件会一直成立,导致 “死循环”(代码永远执行下去,只能强制关闭程序)。
- 经典实战案例
- 案例 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("列表中没有负数") # 输出:列表中没有负数
五、常见坑点与避坑指南
- 死循环:最常见的错误!
原因:while循环中没有更新条件变量(比如i一直不变),或条件永远为 True(比如while 1:)。
解决:每次写while循环时,先检查 “是否有更新条件的代码”;测试时如果卡住,按Ctrl+C强制终止。 - 缩进错误:Python 的缩进是语法的一部分!
原因:循环体没有缩进,或缩进不一致(有的用 4 空格,有的用 Tab)。
解决:统一用 4 个空格缩进;IDE(如 PyCharm、VS Code)会自动帮你对齐,避免手动调整。 - 遍历字典时修改字典:直接在遍历中删除 / 添加键值对会报错!
原因:字典在遍历过程中不能修改 “大小”(即不能增删键)。
解决:先遍历字典的 “副本”(比如for key in list(student.keys()):),再修改原字典。 - range () 的 “左闭右开” 特性:容易误解范围!
比如range(1,5)生成的是 1,2,3,4(不含 5),不是 1-5。
解决:记住 “end 参数要比目标值大 1”,比如要到 5,就写range(1,6)。
六、总结:该用 for 还是 while?
很多场景下,for和while可以互相替代,但选择合适的循环能让代码更易读:
最后,记住一句话:循环的本质是 “减少重复代码”。写循环时,先想清楚 “要重复做什么”“什么时候停止”,再选择合适的循环结构 —— 多练几个案例(比如批量处理文件、统计数据),很快就能熟练掌握!如果觉得这篇文章有用,欢迎点赞、在看,分享给身边学 Python 的朋友~ 有任何疑问,也可以在评论区留言交流哦!