阿你爸爸 发表于 2020-12-28 21:55:28

关于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循环的理解不够深刻吗?

jackz007 发表于 2020-12-28 22:12:50

   triangle 循环以后是这样吗?
[[], [], [], [], [], [], [], [], [], []]
   其实,不用循环,下面的语句也可以实现
triangle = []
triangle = * 10

Daniel_Zhang 发表于 2020-12-29 02:38:40

# 初始化杨辉三角形
# 创建一个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()

阿你爸爸 发表于 2020-12-30 21:57:52

jackz007 发表于 2020-12-28 22:12
triangle 循环以后是这样吗?

   其实,不用循环,下面的语句也可以实现

我跟你理解的一样. 以我的理解

triangle = []
for i in range(10):
      triangle.append([])

这段代码最终打印出来的应该是[[], [], [], [], [], [], [], [], [], []] 而不应该是

[[]]
[[], []]
[[], [], []]
[[], [], [], []]
[[], [], [], [], []]
[[], [], [], [], [], []]
[[], [], [], [], [], [], []]
[[], [], [], [], [], [], [], []]
[[], [], [], [], [], [], [], [], []]
[[], [], [], [], [], [], [], [], [], []]

可程序执行的结果就是后者, 咱俩人的理解都错了.

阿你爸爸 发表于 2020-12-30 22:12:21

我好像理解为什么了.

对于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循环理解不到位.

洋洋痒 发表于 2020-12-30 22:29:04

换行是因为print函数里没有end=的参数的话打印完毕自动换行。假如print里加了一个end=‘ ‘的话打印完下一次打印就不会换行了而是和这次中间隔一个空格

append函数是对列表本身进行改变,第一次循环之后triangle就变成了[[]]第二次循环的时候再一次执行append之后列表本身就变成了[[],[]]以此类推,所以不是I=2的时候执行2次
页: [1]
查看完整版本: 关于for循环的一个疑问