来源:03_循环 hm_10~hm_12 + 网络资料整理
一、详细讲解
1.1 核心概念
嵌套循环与图案打印是Python编程中用于处理二维结构数据的重要知识点。在本课程的第9天,我们将学习循环嵌套的基础概念、九九乘法表的实现、以及各种图案的打印技巧。
嵌套循环是指一个循环内部包含另一个循环的结构。外层循环控制行或外层维度的变化,内层循环控制列或内层维度的变化。通过合理使用嵌套循环,我们可以打印各种规则或不规则的图案,处理矩阵数据,以及解决需要多层迭代的问题。
1.2 嵌套循环基础
1.2.1 嵌套循环的执行原理
# 嵌套循环的基本结构
for i in range(外层次数): # 外层循环
for j in range(内层次数): # 内层循环
# 内层循环体
# 外层循环体(内层循环结束后执行)
1.2.2 执行次数计算
# 嵌套循环总执行次数 = 外层次数 × 内层次数
print("=== 嵌套循环执行次数 ===")
outer_times = 3
inner_times = 4
total_executions = outer_times * inner_times
print(f"外层循环 {outer_times} 次 × 内层循环 {inner_times} 次 = 总执行 {total_executions} 次")
# 演示
count = 0
for i in range(3):
for j in range(4):
count += 1
print(f"i={i}, j={j}", end=" ")
print() # 内层循环结束后换行
print(f"\n实际执行次数: {count}")
输出:
=== 嵌套循环执行次数 === 外层循环 3 次 × 内层循环 4 次 = 总执行 12 次 i=0, j=0 i=0, j=1 i=0, j=2 i=0, j=3 i=1, j=0 i=1, j=1 i=1, j=2 i=1, j=3 i=2, j=0 i=2, j=1 i=2, j=2 i=2, j=3 实际执行次数: 121.3 九九乘法表
1.3.1 标准九九乘法表
# 打印标准九九乘法表
print("=== 九九乘法表 ===")
for i in range(1, 10): # 外层循环:被乘数 1~9
for j in range(1, i + 1): # 内层循环:乘数 1~i
product = i * j
print(f"{j}×{i}={product}", end="\t")
print() # 换行
输出:
=== 九九乘法表 === 1×1=1 2×1=2 2×2=4 3×1=3 2×3=6 3×3=9 4×1=4 2×4=8 3×4=12 4×4=16 5×1=5 2×5=10 3×5=15 4×5=20 5×5=25 6×1=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36 7×1=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49 8×1=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64 9×1=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=811.3.2 下三角九九乘法表
# 打印下三角九九乘法表
print("=== 下三角九九乘法表 ===")
for i in range(1, 10):
for j in range(1, 10):
if j <= i: # 只打印下三角部分
print(f"{j}×{i}={i*j}", end="\t")
print()
1.3.3 带格式的九九乘法表
# 带对齐格式的九九乘法表
print("=== 格式化九九乘法表 ===")
for i in range(1, 10):
line = ""
for j in range(1, i + 1):
line += f"{j}×{i}={i*j:2d} "
print(line)
1.4 常见图案打印
1.4.1 正方形图案
# 实心正方形
n = 5
print("=== 实心正方形 ===")
for i in range(n):
for j in range(n):
print("█", end=" ")
print()
print()
# 空心正方形
print("=== 空心正方形 ===")
for i in range(n):
for j in range(n):
if i == 0 or i == n - 1 or j == 0 or j == n - 1:
print("█", end=" ")
else:
print(" ", end=" ")
print()
输出:
=== 实心正方形 === █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ === 空心正方形 === █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █1.4.2 三角形图案
# 直角三角形(左下角)
n = 5
print("=== 直角三角形(左下角)===")
for i in range(1, n + 1):
for j in range(1, i + 1):
print("█", end=" ")
print()
print()
# 直角三角形(右下角)
print("=== 直角三角形(右下角)===")
for i in range(1, n + 1):
# 先打印空格
for j in range(1, n - i + 1):
print(" ", end=" ")
# 再打印星号
for j in range(1, i + 1):
print("█", end=" ")
print()
print()
# 等腰三角形
print("=== 等腰三角形 ===")
for i in range(1, n + 1):
# 打印空格
for j in range(1, n - i + 1):
print(" ", end=" ")
# 打印星号
for j in range(1, 2 * i):
print("█", end="")
print()
输出:
=== 直角三角形(左下角)=== █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ === 直角三角形(右下角)=== █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ === 等腰三角形 === █ ███ █████ ███████ █████████1.4.3 菱形图案
# 菱形
n = 5
print("=== 菱形 ===")
# 上半部分(包括中间行)
for i in range(1, n + 1):
# 打印空格
for j in range(1, n - i + 1):
print(" ", end="")
# 打印星号
for j in range(1, 2 * i):
print("█", end="")
print()
# 下半部分
for i in range(n - 1, 0, -1):
# 打印空格
for j in range(1, n - i + 1):
print(" ", end="")
# 打印星号
for j in range(1, 2 * i):
print("█", end="")
print()
1.4.4 数字三角形
# 数字三角形
n = 5
print("=== 数字三角形 ===")
for i in range(1, n + 1):
for j in range(1, i + 1):
print(j, end=" ")
print()
print()
# 数字菱形
print("=== 数字菱形 ===")
for i in range(1, n + 1):
# 打印空格
for j in range(1, n - i + 1):
print(" ", end=" ")
# 打印数字
for j in range(1, i + 1):
print(j, end=" ")
print()
for i in range(n - 1, 0, -1):
# 打印空格
for j in range(1, n - i + 1):
print(" ", end=" ")
# 打印数字
for j in range(1, i + 1):
print(j, end=" ")
print()
1.5 矩阵操作
1.5.1 矩阵遍历
# 定义一个3x4矩阵
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
# 按行遍历
print("=== 按行遍历 ===")
for row in matrix:
for element in row:
print(f"{element:3d}", end=" ")
print()
# 带索引遍历
print("\n=== 带索引遍历 ===")
for i in range(len(matrix)):
for j in range(len(matrix[i])):
print(f"matrix[{i}][{j}] = {matrix[i][j]}")
1.5.2 矩阵转置
# 矩阵转置
matrix = [
[1, 2, 3],
[4, 5, 6]
]
rows = len(matrix)
cols = len(matrix[0])
# 创建转置矩阵
transposed = []
for j in range(cols):
new_row = []
for i in range(rows):
new_row.append(matrix[i][j])
transposed.append(new_row)
print("=== 矩阵转置 ===")
print("原矩阵:")
for row in matrix:
print(row)
print("\n转置后:")
for row in transposed:
print(row)
1.6 实用示例
1.6.1 查找质数(埃拉托斯特尼筛法)
# 查找n以内的所有质数
def find_primes(n):
# 初始化:假设所有数都是质数
is_prime = [True] * (n + 1)
is_prime[0] = is_prime[1] = False
# 筛选
for i in range(2, int(n ** 0.5) + 1):
if is_prime[i]:
# 将i的倍数标记为非质数
for j in range(i * i, n + 1, i):
is_prime[j] = False
# 收集结果
return [i for i in range(2, n + 1) if is_prime[i]]
primes = find_primes(100)
print(f"100以内的质数: {primes}")
print(f"共 {len(primes)} 个")
1.6.2 杨辉三角
# 打印杨辉三角
def print_pascal_triangle(n):
triangle = []
for i in range(n):
row = [1] * (i + 1)
for j in range(1, i):
row[j] = triangle[i - 1][j - 1] + triangle[i - 1][j]
triangle.append(row)
# 打印
for row in triangle:
# 前面加空格对齐
print(" " * (n - len(row)) * 2, end="")
for num in row:
print(f"{num:4d}", end="")
print()
print_pascal_triangle(8)
1.6.3 迷宫模拟
# 简单的迷宫遍历
maze = [
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 0, 1],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1]
]
def find_path(maze, start, end):
"""简单的迷宫求解(只演示嵌套循环遍历)"""
rows = len(maze)
cols = len(maze[0])
# 尝试从起点走到终点
for i in range(rows):
for j in range(cols):
if i == start[0] and j == start[1]:
print(f"起点: ({i}, {j})")
if maze[i][j] == 0: # 可通行的路
print(f"探索: ({i}, {j})")
find_path(maze, (1, 0), (4, 3))
1.7 嵌套循环的性能优化
1.7.1 减少计算量
# 低效:每次都计算长度
data = list(range(1000))
for i in range(len(data)):
for j in range(len(data)):
pass # 大量重复计算
# 高效:预先计算长度
n = len(data)
for i in range(n):
for j in range(n):
pass # 避免重复计算
1.7.2 使用列表推导式替代
# 嵌套循环构建矩阵
rows, cols = 3, 4
# 嵌套循环
matrix = []
for i in range(rows):
row = []
for j in range(cols):
row.append(i * cols + j)
matrix.append(row)
# 列表推导式(更高效)
matrix = [[i * cols + j for j in range(cols)] for i in range(rows)]
print("矩阵:")
for row in matrix:
print(row)
1.8 常见错误与调试
# 错误1:缩进错误导致逻辑混乱
# for i in range(3):
# for j in range(3): # 缩进不正确!
# print(i, j)
# 错误2:循环变量使用错误
# for i in range(3):
# for i in range(3): # 覆盖了外层变量
# print(i, j)
# 正确做法:使用不同的变量名
for i in range(3):
for j in range(3):
print(f"i={i}, j={j}")
# 错误3:在内层循环中修改外层循环变量
# for i in range(3):
# for j in range(3):
# i = 10 # 不要这样做!
二、背诵版
Day9 要点速记: 【嵌套循环执行次数】 总次数 = 外层次数 × 内层次数 【九九乘法表】 外层: range(1, 10) # 被乘数 1~9 内层: range(1, i+1) # 乘数 1~当前被乘数 print(end='\t') # 制表符分隔 print() # 换行 【图案打印关键】 - 外层循环:控制行数 - 内层循环:控制每行的内容 - print(end=' ') 控制不换行 - 空格数量决定图案形状 【常见图案】 - 正方形:n×n - 三角形:每行递减/递增 - 菱形:上下对称三、考前记忆
| 要素 | 内容 |
|---|---|
| 今日主题 | 嵌套循环与图案打印 |
| 关键词 | 循环嵌套、九九乘法表、图案 |
| 执行次数 | 外层次数 × 内层次数 |
| 外层控制 | 行数/外层维度 |
| 内层控制 | 每行的列数/内层维度 |
| 重要考点 | 嵌套循环执行次数计算、图案分析 |
四、测试题
1. 单选题: 嵌套循环,外层执行3次,内层执行4次,总执行次数是多少?
- A. 3次
- B. 4次
- C. 7次
- D. 12次
2. 单选题: 以下代码的输出是什么?
for i in range(1, 4):
for j in range(1, i + 1):
print("*", end="")
print()
- A. *** *** ***
- B. * ** ***
- C. * * * *
- D. 编译错误
3. 填空题: 打印九九乘法表时,外层循环控制 _______(填"被乘数"或"乘数")。
4. 填空题: 要打印一个5行的直角三角形,第i行需要打印 _______ 个星号。
5. 简答题: 请描述嵌套循环的执行原理,并说明如何计算总执行次数。
6. 代码题: 使用嵌套循环打印以下图案:
* ** *** ****7. 代码题: 使用嵌套循环打印九九乘法表的第一行到第五行。
8. 代码题: 打印一个5x5的空心正方形。
9. 综合题: 设计一个程序,输入一个数字n,打印n行的金字塔图案。
-
D - 总次数 = 外层次数 × 内层次数 = 3 × 4 = 12次
-
B - i=1时打印1个*,i=2时打印2个*,i=3时打印3个*,输出 * ** ***
-
被乘数 - 外层循环控制1~9的被乘数
-
i - 第i行打印i个星号
n = 4
for i in range(1, n + 1):
for j in range(1, i + 1):
print("*", end="")
print()
for i in range(1, 6):
for j in range(1, i + 1):
print(f"{j}×{i}={i*j}", end="\t")
print()
n = 5
for i in range(n):
for j in range(n):
if i == 0 or i == n - 1 or j == 0 or j == n - 1:
print("█", end=" ")
else:
print(" ", end=" ")
print()
def print_pyramid(n):
for i in range(1, n + 1):
# 打印空格
for j in range(1, n - i + 1):
print(" ", end="")
# 打印星号
for j in range(1, 2 * i):
print("█", end="")
print()
n = int(input("输入金字塔行数: "))
print_pyramid(n)
五、扩展阅读
5.1 多层嵌套循环
# 三层嵌套循环
for i in range(2):
for j in range(2):
for k in range(2):
print(f"({i}, {j}, {k})")
5.2 动态图案生成
# 根据用户输入生成不同的图案
def print_pattern(n, pattern_type):
if pattern_type == "triangle":
for i in range(1, n + 1):
print("*" * i)
elif pattern_type == "inverted_triangle":
for i in range(n, 0, -1):
print("*" * i)
elif pattern_type == "diamond":
for i in range(1, n + 1):
print(" " * (n - i) + "*" * (2 * i - 1))
for i in range(n - 1, 0, -1):
print(" " * (n - i) + "*" * (2 * i - 1))
print_pattern(5, "diamond")
5.3 二维数组操作技巧
# 创建二维数组
rows, cols = 3, 4
matrix = [[0] * cols for _ in range(rows)]
# 填充
for i in range(rows):
for j in range(cols):
matrix[i][j] = i * cols + j + 1
# 打印
for row in matrix:
print(" ".join(f"{x:2d}" for x in row))
# 对角线元素
print("\n主对角线:", [matrix[i][i] for i in range(min(rows, cols))])
恭喜完成Day9学习!明天我们将学习函数定义与调用,掌握代码封装和复用的基本技能。