关于for循环的一个疑问
在第20讲的动手题中,需要用python生成一个杨辉三角。开始有几行代码就完全看不懂了。
triangle = []
for i in range(10):
triangle.append([])
这几行看不明白,于是我就在下面增加了一个triangle,然后回车。
发现打印了这么个玩意儿:
[[]]
[[], []]
[[], [], []]
[[], [], [], []]
[[], [], [], [], []]
[[], [], [], [], [], []]
[[], [], [], [], [], [], []]
[[], [], [], [], [], [], [], []]
[[], [], [], [], [], [], [], [], []]
[[], [], [], [], [], [], [], [], [], []]
这是为什么呢?i是在range(10)里面跑了个循环,跑了10轮,第一轮i=1,第二轮i=2,……,第10轮i=10。可然后呢?为什么第二轮i=2的时候,triangle这个列表就要换一行,然后执行两次triangle.append([])呢?原理是什么?
是我对for循环的理解不够深刻吗? triangle 循环以后是这样吗?
[[], [], [], [], [], [], [], [], [], []]
其实,不用循环,下面的语句也可以实现
triangle = []
triangle = * 10 # 初始化杨辉三角形
# 创建一个10*10的二维列表,并将所有的元素初始化为0
triangle = []
for i in range(10):
triangle.append([]) # 此处表明,插入 10 个 空列表,作为 triangle 的 每一行, 用来存储每一行对应的列,即每一行的元素,此时 triangle 列表里面一共会添加 10 个 单独的空列表
for j in range(10):
if j <= i:# 通过观察可以得知,杨慧三角的每一行的元素个数,与该行的行数相等,所以当 列数 j 小于等于 行数 i 时,持续向行里面添加 0,进行初始化
triangle.append(0)
# 当 j 大于 i 时,则不向该行继续添加元素,内层 for 循环结束后,自动进入下一行,直到运行完十行
# 此处为测试代码,仅供参考,方便理解
for i in range(10):
for j in range(10):
if j <= i:
print(triangle, end = ' ') # 每次打印后,不换行,以空格结尾
print() # 当打印完一行后,换行
# 测试代码完结,下面为程序主体
# 计算杨辉三角形
# 根据观察,我们知道杨辉三角形左右两边的元素均为1
for i in range(10):
triangle = 1# 最左侧的元素赋值为 1
triangle = 1# 最右侧的元素赋值为 1
# 此处为测试代码,仅供参考,方便理解
for i in range(10):
for j in range(10):
if j <= i:
print(triangle, end = ' ')
print()
# 测试代码完结,下面为程序主体
for i in range(2, 10):# 根据观察,从第二行开始,才存在 ”第i行j列的值 = 第(i-1)行(j-1)列的值 + 第(i-1)行(j)列的值“ 的情况
for j in range(1, i): # 每一行的第一个数为 1,所以此处从 triangle 开始遍历,直到 triangle
triangle = triangle + triangle# 第i行j列的值 = 第(i-1)行(j-1)列的值 + 第(i-1)行(j)列的值
# 此处打印杨辉三角结果
for i in range(10):
for j in range(10):
if j <= i:
print(triangle, end = ' ')
print() jackz007 发表于 2020-12-28 22:12
triangle 循环以后是这样吗?
其实,不用循环,下面的语句也可以实现
我跟你理解的一样. 以我的理解
triangle = []
for i in range(10):
triangle.append([])
这段代码最终打印出来的应该是[[], [], [], [], [], [], [], [], [], []] 而不应该是
[[]]
[[], []]
[[], [], []]
[[], [], [], []]
[[], [], [], [], []]
[[], [], [], [], [], []]
[[], [], [], [], [], [], []]
[[], [], [], [], [], [], [], []]
[[], [], [], [], [], [], [], [], []]
[[], [], [], [], [], [], [], [], [], []]
可程序执行的结果就是后者, 咱俩人的理解都错了. 我好像理解为什么了.
对于for函数而言, 每循环一次, 它就会把这一次循环的值给打印出来. 例如:
for i in range(10):
print(i)
那么, 我们就会得到:
0
1
2
3
4
5
6
7
8
9
同样的道理. 在这一段代码里:
triangle = []
for i in range(10):
triangle.append([])
当i = 0时, 进行第1次循环, append在triangle这个列表中添加了第1个元素, 这个元素就是[], 此时triangle = [[]]. for循环将它打印出来:
[[]]
当i = 0时, 进行第2次循环, append在triangle这个列表中又添加了1元素[], 此时triangle = [[],[]]. for循环将它打印出来:
[[],[]]
以此类推
当for循环结束的时候, triangle = [[],[],[],[],[],[],[],[],[],[]] 然而, 此时输入triangle, 会发现屏幕上出现的是:
[[]]
[[], []]
[[], [], []]
[[], [], [], []]
[[], [], [], [], []]
[[], [], [], [], [], []]
[[], [], [], [], [], [], []]
[[], [], [], [], [], [], [], []]
[[], [], [], [], [], [], [], [], []]
[[], [], [], [], [], [], [], [], [], []]
这并不意味着此时屏幕上打印的内容就是triangle的值, 就像上面第一个for循环把0~9都打印下来一样, 程序只是把for循环10次执行的结果一次性打印出来了而已. 为了验证我的想法是不是对的. 我重新再输入triangle, 按回车. 这才是执行完for循环以后, triangle此时此刻的值.
[[], [], [], [], [], [], [], [], [], []]
哈哈哈, 茅塞顿开! 本质上还是对for循环理解不到位.
换行是因为print函数里没有end=的参数的话打印完毕自动换行。假如print里加了一个end=‘ ‘的话打印完下一次打印就不会换行了而是和这次中间隔一个空格
append函数是对列表本身进行改变,第一次循环之后triangle就变成了[[]]第二次循环的时候再一次执行append之后列表本身就变成了[[],[]]以此类推,所以不是I=2的时候执行2次
页:
[1]