Python实战第5期:循环结构

0 阅读9分钟

在这里插入图片描述

引言:为什么需要循环?

在前面的课程中,我们编写的程序都是按顺序执行的。但有时候,我们需要重复执行某些操作。

比如:

  • 打印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}")

七、本篇小结

今天,我们完成了以下学习内容:

  1. for循环:遍历序列,配合range()使用
  2. while循环:条件判断,适合不知道循环次数的场景
  3. break:跳出整个循环
  4. continue:跳过当前迭代,继续下一次
  5. 循环的else子句:循环正常结束时执行
  6. 嵌套循环:循环内部再包含循环

请记住这三个结论:

  1. for适合遍历:已知序列或次数时使用for循环
  2. while适合条件:不知道循环次数,只知道结束条件时使用while循环
  3. break和continue控制流程:break跳出循环,continue跳过当前迭代

下期预告

在第6期中,我们将学习Python的列表和元组,包括:

  • 列表的创建和基本操作
  • 列表的常用方法
  • 列表切片
  • 元组的概念和使用

敬请期待!


✍坚持原创,求关注,点赞,收藏