题目描述与分析
题目描述:
编写一个程序,模拟打印一个正方形的框。程序应该接受用户输入的正整数作为正方形的边长,并打印相应大小的正方形框。 请注意,内部为空白,外部是由 “*” 字符组成的框
输入描述:
输入只有一行,为正方形的边长 n
输出描述:
输出正方形组成的框
一、循环嵌套
我们之前已经知道了如何遍历列表结构,比如下面一个长度为5的列表
my_list = [1, 2, 3, 4, 5]
# 使用for循环遍历列表
for item in my_list:
print(item)
但数据的组织形式除了是一维的,还可能是多维的,比如数学中的矩阵、表格、游戏棋盘。
上图中的数据就是一个二维列表,它是由行和列组成的表格状数据结构,可以理解为包含其他列表的列表(列表的每一个元素都是列表),二维列表的元素可以通过两个索引来访问,一个索引表示行,另一个表示列, 比如matrix[0][0] 表示第一行第一列的元素,值为1,matrix[2][2] 表示第三行第三列的元素,值为13。
由于是二维的,显然这个时候想要直接通过一层for循环来实现遍历是不太现实的,这就需要使用到前言中所讲的循环嵌套。
# 创建一个包含二维数据的二维列表,即列表的每一个元素都是一个列表
matrix = [
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25]
]
# 遍历二维列表
for row in matrix: # 外部循环迭代行,也就是第一行,第二行... 第n行
for item in row: # 内部循环迭代列,也就是第一列,第二列...第n列
print(item, end=" ") # 输出元素值
# 在每行结束后换行
print()
这里就使用了两层for循环, 外部的 for 循环 i 用于控制迭代行,在每一行的迭代内部,有了第二个for循环,用于控制每一行中各列的迭代(即一个列表的遍历),通过这两个循环的嵌套,可以遍历整个二维列表,并使用 matrix[i][j] 访问每个元素的值。在每行结束后,使用 print()换行到下一行。
二、代码编写
题目要求我们模拟打印一个正方形的框,根据题目可以联想到我们需要使用循环嵌套来控制行和列的打印,并根据当前行和列的位置来决定打印 “*”(外部边界)还是空白(内部)。
先接收一个整数的输入表示正方形的边长
n = int(input()) # 输入正方形的边长
然后需要一个循环嵌套来控制打印
# 外层for循环控制每一行
for i in range(n):
# 内层for循环控制每一列
for j in range(n):
# 输出元素值
# 每行打印完之后,输出换行,行数i + 1, 转到下一行中
print()
题目要求边界打印“*”,非边界打印空白,这种需要使用if-else
# 如果处于边界,打印 *
if :
print("*", end="")
else:
# 否则,打印空格
print(" ", end="")
所需要判定的边界其实指的是第一行、最后一行、第一列、最后一列,只需要满足这四个条件中的任何一个就表示当前遍历的位置处在边界中。
i == 0 # 表示第一行
i == n - 1 # 表示最后一行
j == 0 # 表示第一列
j == n - 1 # 表示最后一列
四个条件,不可能使用四个if语句来进行判定,我们可以使用之前所讲的逻辑或运算符or来组合多个条件,只要其中任何一个条件为真(true),整个表达式就会被认为是真(true)
if i == 0 or i == n - 1 or j == 0 or j == n - 1:
# 只要满足上面条件的一个,就会判定为真,执行逻辑体中的代码
print("*", end="")
完整代码如下:
n = int(input()) # 输入正方形的边长
# 打印正方形框
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()
三、延伸
除了for循环嵌套之外,Python中的循环嵌套还有多种形式,比如while循环嵌套
i = 1
while i <= 5:
# 重置内部循环的计数器
j = 1
while j <= 5:
# 嵌套循环的代码
j += 1
# 下一轮循环
i += 1
在嵌套循环中,break 和 continue 语句的作用方式与在单层循环中一样, 但是它们只会退出最内层的循环,不会影响外层循环的执行。
for i in range(5):
for j in range(5):
if j == 2: # 当 j == 2时,跳出内层循环,但是会进行 i + 1的下一轮循环
break # 这将退出内层循环,但外层循环仍然继续执行