我的问题不是围绕输出,而是更多关于我们如何达到输出
原始-
n=5
i=0
j=1
line=''
for i in range(i,n+1):
for j in range(j,i+1):
line = line + str(j) + " "
j += 1
i +=1
print( line)
我得到预期的输出-
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
现在,如果我删除i +=1
,我仍然会得到相同的输出。我不确定为什么吗?
为了进一步测试,我尝试删除j +=1
,以查看
n=5
i=0
j=1
line=''
for i in range(i,n+1):
for j in range(j,i+1):
line = line + str(j) + " "
#j += 1 ##Commenting the inner loop
#i +=1 ##Commenting the outer loop
print( line)
输出-
1
1 1 2
1 1 2 2 3
1 1 2 2 3 3 4
1 1 2 2 3 3 4 4 5
现在我很困惑,为什么除去外部循环不会更改任何内容,但是内部循环会更改输出?如果我删除了外循环,它为什么会递增?
答案 0 :(得分:1)
在第一个版本中,您会遇到一些相互抵消的错误。这是不带手动增量的正确版本:
n, i, j = 5, 0, 1
for i in range(1,n+1):
line = ""
for j in range(1,i+1):
line = line + str(j) + " "
print(line)
真正的问题是:为什么手动增量版本有效?让我们尝试遵循以下逻辑:
首先,如果删除i += 1
行,结果将保持不变,因为范围range(i,n+1)
到range(0,n+1)
的计算一次。实际上,在评估范围时,i
的值为0
。该代码等效于:
for i in range(0,n+1):
for j in range(j,i+1):
line = line + str(j) + " "
j += 1
print( line)
让我们看一下for j in range(j,i+1)
。由于j
递增,因此其值始终与i
相同,因此此范围仅包含一个元素:range(1,2)
,range(2,3)
,...代码等效于:
for i in range(1,n+1): # j starts at 1
for j in range(i,i+1):
line = line + str(j) + " "
print( line)
等同于:
for i in range(1,n+1):
j = i
line = line + str(j) + " "
print( line)
或者:
for i in range(1,n+1):
line = line + str(i) + " "
print( line)
要理解的是,您不必为每个i
都建立一行,而是要建立1 2 3 4 5
行并打印中间结果。
奖金:一线版:
print("\n".join(" ".join(str(j) for j in range(1, i+1)) for i in range(1, n+1)))
答案 1 :(得分:1)
在迭代循环时,手动增加计数器i和j不会更改计数器变量的状态。运行以下代码以了解:
for i in range(1,5):
print(i)
i +=2
print(i)
print('**')
输出:
1
3
**
2
4
**
3
5
**
4
6
**
答案 2 :(得分:0)
内部循环与外部循环之间的区别在于,在外部循环的每次迭代中,都会创建新的内部循环,因此内部循环的起始点(j)取决于在循环外定义的变量“ j”与在循环外定义的“ i”不同,但是每次迭代时,“ for循环”都会保存循环的元数据(我想),并查看最后一次迭代。 / p>
,而在外循环中增量不起作用的原因- for循环仅依赖于for循环中定义的i和每个循环,他查看最后一次迭代的值,当内部循环每个外部迭代创建新的for循环并查看j的值时。
此外 如果您在已知的DS(Array,Dict ..)上使用for循环,则pythonic方法是对元素进行迭代,而不是使用索引的“ C”样式:)