7  循环与列表推导式

7.1 循环:重复执行的智慧

想象你在做体育课的热身运动,需要做10个俯卧撑。你不会每次都写”做一个俯卧撑”,而是说”重复10次”。Python中的循环就是这个道理!

7.1.1 for 循环:有明确次数的重复

for 循环就像是一个”计数器”,可以帮我们重复执行特定的任务。

7.1.1.1 基本用法

# 打印班级前五名同学的名字
top_students = ["小明", "小红", "小华", "小李", "小张"]

print("班级前五名同学是:")
for student in top_students:
    print(f"- {student}")
班级前五名同学是:
- 小明
- 小红
- 小华
- 小李
- 小张

7.1.1.2 使用range()函数

range() 函数可以生成一系列数字,常用于控制循环次数:

# 做5次俯卧撑
print("开始锻炼:")
for i in range(5):  # 从0数到4,总共5次
    print(f"第{i+1}个俯卧撑")

# range的三种用法
print("\nrange的三种用法:")
print("range(5):", list(range(5)))          # 从0开始,到5结束
print("range(2, 5):", list(range(2, 5)))    # 从2开始,到5结束
print("range(1, 10, 2):", list(range(1, 10, 2)))  # 从1开始,到10结束,每次加2
开始锻炼:
第1个俯卧撑
第2个俯卧撑
第3个俯卧撑
第4个俯卧撑
第5个俯卧撑

range的三种用法:
range(5): [0, 1, 2, 3, 4]
range(2, 5): [2, 3, 4]
range(1, 10, 2): [1, 3, 5, 7, 9]

7.1.1.3 实际应用示例

# 成绩统计计算
test_scores = [85, 55, 92, 45, 78, 65, 88]
print("成绩分析:")

# 初始化统计变量
total = 0
count = 0

# 遍历所有分数
for score in test_scores:
    if score >= 60:  # 及格
        total += score
        count += 1

# 输出统计结果
if count > 0:
    average = total / count
    print(f"及格人数:{count}")
    print(f"及格分数平均分:{average:.1f}")
else:
    print("没有及格的分数")
成绩分析:
及格人数:5
及格分数平均分:81.6

7.1.2 while 循环:条件满足就重复

while 循环会在条件为真时一直重复。就像你玩游戏时的”只要还有生命值就继续玩”。

7.1.2.1 基本用法

# 模拟倒计时
time_left = 5
print("倒计时开始!")
while time_left > 0:
    print(f"还剩 {time_left} 秒")
    time_left = time_left - 1
print("时间到!")
倒计时开始!
还剩 5 秒
还剩 4 秒
还剩 3 秒
还剩 2 秒
还剩 1 秒
时间到!

7.1.2.2 实际应用示例

# 猜数字游戏
import random
secret = random.randint(1, 10)  # 生成1-10的随机数
attempts = 0
max_attempts = 3

print("猜数字游戏开始!(1-10)")

while attempts < max_attempts:
    try:
        guess = int(input(f"还剩{max_attempts - attempts}次机会,请猜一个数字:"))
        attempts += 1
        
        if guess == secret:
            print(f"恭喜你,猜对了!答案就是{secret}")
            break
        elif guess < secret:
            print("猜小了!")
        else:
            print("猜大了!")
    except:
        print("请输入有效的数字!")

print(f"游戏结束!正确答案是{secret}")

7.1.3 循环控制:特殊情况的处理

有时我们需要在特定情况下改变循环的行为:

  1. break:立即结束循环(相当于紧急出口)
  2. continue:跳过本次循环剩余部分(相当于跳过当前轮)
  3. pass:什么都不做(相当于占位符)
# 模拟找座位
seats = ["空", "已占", "空", "已占", "空"]

print("寻找空座位:")
for i, status in enumerate(seats):
    if status == "已占":
        print(f"第{i+1}号座位已占,继续找下一个")
        continue  # 跳过已占座位
        
    print(f"第{i+1}号座位是空的,可以坐!")
    break  # 找到空座位就停止寻找
寻找空座位:
第1号座位是空的,可以坐!

7.1.4 循环的嵌套

循环中还可以包含循环,就像你在完成作业时:对每一科(外层循环),都要做多道题(内层循环)。

# 打印九九乘法表(一部分)
print("九九乘法表:")
for i in range(1, 4):  # 只打印前三行
    for j in range(1, i + 1):
        print(f"{j}×{i}={i*j}", end="\t")
    print()  # 换行
九九乘法表:
1×1=1   
1×2=2   2×2=4   
1×3=3   2×3=6   3×3=9   

7.1.4.1 练习题

  1. 使用for循环打印出1-100中所有的偶数

🌟 要点总结

  1. for循环用于知道循环次数的情况
  2. while循环用于根据条件重复的情况
  3. range()函数可以生成数字序列
  4. break用于提前结束循环
  5. continue用于跳过当前轮
  6. pass用于占位
  7. 可以在循环中嵌套循环

7.2 列表推导式:创建列表的快捷方式

想象你在做数学题,要写出1到10的平方数。你可以一个一个计算,也可以用一个数学公式直接表达。列表推导式就像这样的”公式”,帮我们快速创建列表!

7.2.1 基本用法

传统方式vs列表推导式:

# 传统方式:创建1到5的平方数
squares1 = []
for i in range(1, 6):
    squares1.append(i ** 2)
print("传统方式:", squares1)

# 列表推导式:一行搞定!
squares2 = [i ** 2 for i in range(1, 6)]
print("列表推导式:", squares2)
传统方式: [1, 4, 9, 16, 25]
列表推导式: [1, 4, 9, 16, 25]

7.2.2 理解列表推导式

列表推导式的基本格式是:

[表达式 for 变量 in 序列]

就像在说:

  • “我要创建一个列表”(用[]表示)
  • “对序列中的每个数”(for 部分)
  • “进行某种运算”(表达式部分)

7.2.3 实用例子

  1. 创建学生成绩等级
scores = [85, 92, 78, 95, 88]
grades = ['优秀' if x >= 90 else '良好' if x >= 80 else '及格' if x >= 60 else '不及格' for x in scores]

print("成绩:", scores)
print("等级:", grades)
成绩: [85, 92, 78, 95, 88]
等级: ['良好', '优秀', '及格', '优秀', '良好']
  1. 筛选符合条件的数据
# 找出及格的分数
scores = [65, 45, 75, 85, 55, 90, 82]
passing_scores = [score for score in scores if score >= 60]
print("所有分数:", scores)
print("及格分数:", passing_scores)
所有分数: [65, 45, 75, 85, 55, 90, 82]
及格分数: [65, 75, 85, 90, 82]
  1. 处理字符串列表
# 把名字都变成大写
names = ["alice", "bob", "charlie", "david"]
upper_names = [name.upper() for name in names]
print("原始名单:", names)
print("大写名单:", upper_names)
原始名单: ['alice', 'bob', 'charlie', 'david']
大写名单: ['ALICE', 'BOB', 'CHARLIE', 'DAVID']

7.2.4 带条件的列表推导式

可以在列表推导式中加入if条件,格式是:

[表达式 for 变量 in 序列 if 条件]
# 找出1-10中所有偶数的平方
even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print("1-10中偶数的平方:", even_squares)

# 找出字符串列表中长度大于3的单词
words = ["cat", "dog", "elephant", "bird", "butterfly"]
long_words = [word for word in words if len(word) > 3]
print("\n长度大于3的单词:", long_words)
1-10中偶数的平方: [4, 16, 36, 64, 100]

长度大于3的单词: ['elephant', 'bird', 'butterfly']

🌟 要点总结

  1. 列表推导式可以简化代码
  2. 可以带条件筛选数据
  3. 列表推导式比传统循环更简洁