引言:为什么需要循环?
在前面的课程中,我们编写的程序都是按顺序执行的。但有时候,我们需要重复执行某些操作。
比如:
- 打印1到100的所有数字
- 计算1+2+3+...+100的和
- 遍历一个列表中的所有元素
如果没有循环,我们需要写100行代码来打印1到100。有了循环,只需要几行代码就能搞定。
循环是编程中最重要的概念之一,掌握了循环,你的程序就能处理大量重复性的工作。
一、for循环
1. for循环的基本语法
for循环用于遍历一个序列(如列表、字符串、范围等),对序列中的每个元素执行相同的操作。
# 基本语法
# for 变量 in 序列:
# 执行代码
# 遍历列表
fruits = ["苹果", "香蕉", "橙子"]
for fruit in fruits:
print(fruit)
输出:
苹果
香蕉
橙子
2. range()函数
range() 函数用于生成一个数字序列,常与for循环配合使用。
# range(stop) - 生成0到stop-1的序列
for i in range(5):
print(i) # 输出:0 1 2 3 4
# range(start, stop) - 生成start到stop-1的序列
for i in range(1, 6):
print(i) # 输出:1 2 3 4 5
# range(start, stop, step) - 生成start到stop-1的序列,步长为step
for i in range(0, 10, 2):
print(i) # 输出:0 2 4 6 8
# 倒序
for i in range(5, 0, -1):
print(i) # 输出:5 4 3 2 1
💡 提示:range() 生成的序列不包含stop值,是"左闭右开"的区间。
3. for循环的应用
示例1:计算1到100的和
total = 0
for i in range(1, 101):
total += i
print(f"1到100的和是:{total}") # 输出:5050
示例2:遍历字符串
text = "Python"
for char in text:
print(char)
输出:
P
y
t
h
o
n
示例3:打印九九乘法表
for i in range(1, 10):
for j in range(1, i + 1):
print(f"{j}×{i}={i*j}", end="\t")
print() # 换行
输出:
1×1=1
1×2=2 2×2=2
1×3=3 2×3=6 3×3=3
1×4=4 2×4=8 3×4=12 4×4=4
...
示例4:遍历字典
student = {"name": "小明", "age": 20, "score": 95}
# 遍历键
for key in student:
print(key)
# 遍历值
for value in student.values():
print(value)
# 遍历键值对
for key, value in student.items():
print(f"{key}: {value}")
4. enumerate()函数
enumerate() 函数用于在遍历时同时获取索引和值。
fruits = ["苹果", "香蕉", "橙子"]
# 不使用enumerate
for i in range(len(fruits)):
print(f"{i}: {fruits[i]}")
# 使用enumerate(推荐)
for i, fruit in enumerate(fruits):
print(f"{i}: {fruit}")
输出:
0: 苹果
1: 香蕉
2: 橙子
💡 提示:enumerate() 可以指定起始索引:
enumerate(fruits, start=1)
二、while循环
1. while循环的基本语法
while循环在条件为True时重复执行代码块,直到条件变为False。
# 基本语法
# while 条件:
# 执行代码
# 示例:打印1到5
i = 1
while i <= 5:
print(i)
i += 1 # 别忘了更新变量,否则会死循环
输出:
1
2
3
4
5
⚠️ 警告:while循环一定要确保条件最终会变为False,否则会陷入死循环!
2. while循环的应用
示例1:用户输入验证
password = ""
while password != "123456":
password = input("请输入密码:")
print("密码正确,欢迎!")
示例2:猜数字游戏
import random
# 生成随机数
answer = random.randint(1, 100)
guess = 0
attempts = 0
print("我想了一个1到100之间的数字,猜猜看!")
while guess != answer:
guess = int(input("你的猜测:"))
attempts += 1
if guess < answer:
print("太小了!")
elif guess > answer:
print("太大了!")
else:
print(f"恭喜你,猜对了!你一共猜了{attempts}次。")
示例3:计算阶乘
n = int(input("请输入一个正整数:"))
result = 1
i = 1
while i <= n:
result *= i
i += 1
print(f"{n}! = {result}")
示例4:斐波那契数列
# 打印前20个斐波那契数
a, b = 0, 1
count = 0
while count < 20:
print(a, end=" ")
a, b = b, a + b
count += 1
输出:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
3. while循环与for循环的选择
| 场景 | 推荐循环 |
|---|---|
| 遍历序列(列表、字符串等) | for循环 |
| 已知循环次数 | for循环 |
| 条件判断,不知道循环次数 | while循环 |
| 需要等待某个条件满足 | while循环 |
# for循环:已知次数
for i in range(5):
print(i)
# while循环:条件判断
while user_input != "quit":
user_input = input("输入quit退出:")
三、break和continue
1. break:跳出循环
break 用于立即跳出当前循环,不再执行剩余的循环。
# 找到第一个偶数就停止
for i in range(1, 10):
if i % 2 == 0:
print(f"找到第一个偶数:{i}")
break
print(i)
输出:
1
找到第一个偶数:2
break的实际应用
# 用户登录验证
max_attempts = 3
attempts = 0
while attempts < max_attempts:
password = input("请输入密码:")
if password == "123456":
print("登录成功!")
break
else:
attempts += 1
print(f"密码错误,还剩{max_attempts - attempts}次机会")
else:
print("登录失败,账户已锁定")
2. continue:跳过当前迭代
continue 用于跳过当前迭代,直接进入下一次循环。
# 只打印奇数
for i in range(1, 10):
if i % 2 == 0:
continue # 跳过偶数
print(i)
输出:
1
3
5
7
9
continue的实际应用
# 处理数据时跳过无效值
data = [10, -5, 20, -3, 30, -8, 40]
print("正数列表:")
for num in data:
if num < 0:
continue # 跳过负数
print(num)
输出:
正数列表:
10
20
30
40
3. break和continue的区别
# break:完全跳出循环
print("使用break:")
for i in range(1, 6):
if i == 3:
break
print(i)
# 输出:1 2
# continue:跳过当前迭代,继续下一次
print("\n使用continue:")
for i in range(1, 6):
if i == 3:
continue
print(i)
# 输出:1 2 4 5
4. 循环的else子句
Python的循环可以有一个else子句,当循环正常结束(没有被break打断)时执行。
# for循环的else
for i in range(1, 6):
print(i)
else:
print("循环正常结束")
# while循环的else
i = 1
while i <= 5:
print(i)
i += 1
else:
print("循环正常结束")
else子句的实际应用
# 查找素数
num = 17
for i in range(2, num):
if num % i == 0:
print(f"{num}不是素数,可以被{i}整除")
break
else:
# 循环正常结束,说明没有找到因子
print(f"{num}是素数")
💡 提示:else子句只在循环没有被break打断时执行。
四、嵌套循环
1. 嵌套循环的概念
循环可以嵌套使用,即在一个循环内部再包含另一个循环。
# 外层循环执行一次,内层循环执行完整的一轮
for i in range(3):
for j in range(2):
print(f"i={i}, j={j}")
输出:
i=0, j=0
i=0, j=1
i=1, j=0
i=1, j=1
i=2, j=0
i=2, j=1
2. 嵌套循环的应用
示例1:打印图形
# 打印直角三角形
for i in range(1, 6):
for j in range(i):
print("*", end=" ")
print()
输出:
*
* *
* * *
* * * *
* * * * *
示例2:遍历二维列表
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 遍历二维列表
for row in matrix:
for item in row:
print(item, end=" ")
print()
输出:
1 2 3
4 5 6
7 8 9
示例3:冒泡排序
# 冒泡排序算法
numbers = [64, 34, 25, 12, 22, 11, 90]
n = len(numbers)
for i in range(n):
for j in range(0, n - i - 1):
if numbers[j] > numbers[j + 1]:
# 交换元素
numbers[j], numbers[j + 1] = numbers[j + 1], numbers[j]
print("排序后的数组:")
for num in numbers:
print(num, end=" ")
输出:
排序后的数组:
11 12 22 25 34 64 90
五、实战练习
练习1:打印图案
# 打印菱形
n = 5
# 上半部分(包括中间行)
for i in range(1, n + 1):
print(" " * (n - i) + "* " * i)
# 下半部分
for i in range(n - 1, 0, -1):
print(" " * (n - i) + "* " * i)
练习2:找出所有素数
# 找出1到100之间的所有素数
primes = []
for num in range(2, 101):
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
break
else:
primes.append(num)
print(f"1到100之间的素数有{len(primes)}个:")
print(primes)
练习3:猜数字游戏(带提示)
import random
answer = random.randint(1, 100)
attempts = 0
max_attempts = 7
print("我想了一个1到100之间的数字,你有7次机会!")
while attempts < max_attempts:
guess = int(input(f"第{attempts + 1}次猜测:"))
attempts += 1
if guess == answer:
print(f"恭喜你,猜对了!你一共猜了{attempts}次。")
break
elif guess < answer:
print("太小了!")
else:
print("太大了!")
else:
print(f"很遗憾,机会用完了。正确答案是{answer}。")
练习4:统计字符
# 统计字符串中各类字符的数量
text = input("请输入一段文字:")
letters = 0
digits = 0
spaces = 0
others = 0
for char in text:
if char.isalpha():
letters += 1
elif char.isdigit():
digits += 1
elif char.isspace():
spaces += 1
else:
others += 1
print(f"\n统计结果:")
print(f"字母:{letters}个")
print(f"数字:{digits}个")
print(f"空格:{spaces}个")
print(f"其他:{others}个")
六、常见问题与排错
问题1:死循环
原因:while循环的条件永远为True 解决方法:确保循环条件最终会变为False
# ❌ 错误:死循环
i = 1
while i <= 5:
print(i)
# 忘记更新i
# ✅ 正确
i = 1
while i <= 5:
print(i)
i += 1 # 更新变量
问题2:break和continue混淆
原因:不理解break和continue的区别 解决方法:
- break:完全跳出循环
- continue:跳过当前迭代,继续下一次
# break:找到就停止
for i in range(1, 10):
if i == 5:
break
print(i) # 输出:1 2 3 4
# continue:跳过5
for i in range(1, 10):
if i == 5:
continue
print(i) # 输出:1 2 3 4 6 7 8 9
问题3:嵌套循环变量名冲突
原因:内外层循环使用相同的变量名 解决方法:使用不同的变量名
# ❌ 错误
for i in range(3):
for i in range(2): # 变量名冲突
print(i)
# ✅ 正确
for i in range(3):
for j in range(2): # 使用不同的变量名
print(f"i={i}, j={j}")
七、本篇小结
今天,我们完成了以下学习内容:
- for循环:遍历序列,配合range()使用
- while循环:条件判断,适合不知道循环次数的场景
- break:跳出整个循环
- continue:跳过当前迭代,继续下一次
- 循环的else子句:循环正常结束时执行
- 嵌套循环:循环内部再包含循环
请记住这三个结论:
- for适合遍历:已知序列或次数时使用for循环
- while适合条件:不知道循环次数,只知道结束条件时使用while循环
- break和continue控制流程:break跳出循环,continue跳过当前迭代
下期预告
在第6期中,我们将学习Python的列表和元组,包括:
- 列表的创建和基本操作
- 列表的常用方法
- 列表切片
- 元组的概念和使用
敬请期待!
✍坚持原创,求关注,点赞,收藏