鱼C论坛

 找回密码
 立即注册
查看: 1774|回复: 5

[已解决]关于for循环的一个疑问

[复制链接]
发表于 2020-12-28 21:55:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在第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循环的理解不够深刻吗?
最佳答案
2020-12-29 02:38:40
  1. # 初始化杨辉三角形
  2. # 创建一个10*10的二维列表,并将所有的元素初始化为0
  3. triangle = []
  4. for i in range(10):
  5.     triangle.append([]) # 此处表明,插入 10 个 空列表,作为 triangle 的 每一行, 用来存储每一行对应的列,即每一行的元素,此时 triangle 列表里面一共会添加 10 个 单独的空列表
  6.     for j in range(10):
  7.         if j <= i:  # 通过观察可以得知,杨慧三角的每一行的元素个数,与该行的行数相等,所以当 列数 j 小于等于 行数 i 时,持续向行里面添加 0,进行初始化
  8.             triangle[i].append(0)
  9.         # 当 j 大于 i 时,则不向该行继续添加元素,内层 for 循环结束后,自动进入下一行,直到运行完十行

  10. # 此处为测试代码,仅供参考,方便理解
  11. for i in range(10):
  12.     for j in range(10):
  13.         if j <= i:
  14.             print(triangle[i][j], end = ' ')    # 每次打印后,不换行,以空格结尾
  15.     print() # 当打印完一行后,换行
  16. # 测试代码完结,下面为程序主体

  17. # 计算杨辉三角形
  18. # 根据观察,我们知道杨辉三角形左右两边的元素均为1
  19. for i in range(10):
  20.     triangle[i][0] = 1  # 最左侧的元素赋值为 1
  21.     triangle[i][i] = 1  # 最右侧的元素赋值为 1

  22. # 此处为测试代码,仅供参考,方便理解
  23. for i in range(10):
  24.     for j in range(10):
  25.         if j <= i:
  26.             print(triangle[i][j], end = ' ')
  27.     print()
  28. # 测试代码完结,下面为程序主体

  29. for i in range(2, 10):  # 根据观察,从第二行开始,才存在 ”第i行j列的值 = 第(i-1)行(j-1)列的值 + 第(i-1)行(j)列的值“ 的情况
  30.     for j in range(1, i):   # 每一行的第一个数为 1,所以此处从 triangle[i][1] 开始遍历,直到 triangle[i][i]
  31.         triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j]  # 第i行j列的值 = 第(i-1)行(j-1)列的值 + 第(i-1)行(j)列的值

  32. # 此处打印杨辉三角结果
  33. for i in range(10):
  34.     for j in range(10):
  35.         if j <= i:
  36.             print(triangle[i][j], end = ' ')
  37.     print()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-28 22:12:50 | 显示全部楼层
     triangle 循环以后是这样吗?
  1. [[], [], [], [], [], [], [], [], [], []]
复制代码

     其实,不用循环,下面的语句也可以实现
  1. triangle = []
  2. triangle = [triangle] * 10
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-29 02:38:40 | 显示全部楼层    本楼为最佳答案   
  1. # 初始化杨辉三角形
  2. # 创建一个10*10的二维列表,并将所有的元素初始化为0
  3. triangle = []
  4. for i in range(10):
  5.     triangle.append([]) # 此处表明,插入 10 个 空列表,作为 triangle 的 每一行, 用来存储每一行对应的列,即每一行的元素,此时 triangle 列表里面一共会添加 10 个 单独的空列表
  6.     for j in range(10):
  7.         if j <= i:  # 通过观察可以得知,杨慧三角的每一行的元素个数,与该行的行数相等,所以当 列数 j 小于等于 行数 i 时,持续向行里面添加 0,进行初始化
  8.             triangle[i].append(0)
  9.         # 当 j 大于 i 时,则不向该行继续添加元素,内层 for 循环结束后,自动进入下一行,直到运行完十行

  10. # 此处为测试代码,仅供参考,方便理解
  11. for i in range(10):
  12.     for j in range(10):
  13.         if j <= i:
  14.             print(triangle[i][j], end = ' ')    # 每次打印后,不换行,以空格结尾
  15.     print() # 当打印完一行后,换行
  16. # 测试代码完结,下面为程序主体

  17. # 计算杨辉三角形
  18. # 根据观察,我们知道杨辉三角形左右两边的元素均为1
  19. for i in range(10):
  20.     triangle[i][0] = 1  # 最左侧的元素赋值为 1
  21.     triangle[i][i] = 1  # 最右侧的元素赋值为 1

  22. # 此处为测试代码,仅供参考,方便理解
  23. for i in range(10):
  24.     for j in range(10):
  25.         if j <= i:
  26.             print(triangle[i][j], end = ' ')
  27.     print()
  28. # 测试代码完结,下面为程序主体

  29. for i in range(2, 10):  # 根据观察,从第二行开始,才存在 ”第i行j列的值 = 第(i-1)行(j-1)列的值 + 第(i-1)行(j)列的值“ 的情况
  30.     for j in range(1, i):   # 每一行的第一个数为 1,所以此处从 triangle[i][1] 开始遍历,直到 triangle[i][i]
  31.         triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j]  # 第i行j列的值 = 第(i-1)行(j-1)列的值 + 第(i-1)行(j)列的值

  32. # 此处打印杨辉三角结果
  33. for i in range(10):
  34.     for j in range(10):
  35.         if j <= i:
  36.             print(triangle[i][j], end = ' ')
  37.     print()
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
小甲鱼 + 2 + 2 + 2 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-12-30 21:57:52 | 显示全部楼层
jackz007 发表于 2020-12-28 22:12
triangle 循环以后是这样吗?

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

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

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

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

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

可程序执行的结果就是后者, 咱俩人的理解都错了.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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循环理解不到位.

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-30 22:29:04 From FishC Mobile | 显示全部楼层
换行是因为print函数里没有end=的参数的话打印完毕自动换行。假如print里加了一个end=‘ ‘的话打印完下一次打印就不会换行了而是和这次中间隔一个空格

append函数是对列表本身进行改变,第一次循环之后triangle就变成了[[]]第二次循环的时候再一次执行append之后列表本身就变成了[[],[]]以此类推,所以不是I=2的时候执行2次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 06:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表