去掉外循环中的增量不会改变输出,但是内循环会改变

2024-05-20 20:46:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题不在于产出,而在于我们如何达到产出

原件-

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,看看whet

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

现在我很困惑为什么去掉外循环不会改变任何东西,而内环会改变输出?如果我去掉外环,它怎么会增加?你知道吗


Tags: theinloopforlinerange原件inner
3条回答

内循环与外循环的区别在于,在外循环的每次迭代中,都会创建新的内循环,因此内循环的起点(“j”)取决于在循环外定义的变量“j”的快进,与在循环外定义的“i”不同,但每次迭代“for循环”都会保存循环的元数据(我猜)并查看上一次迭代。你知道吗

这就是为什么在外循环中,增量不起作用的原因- for循环只依赖于在for循环中定义的i,每个循环他都会查看上一个迭代值,而内部循环每次外部迭代都会创建新的for循环并查看j的值

此外 如果在已知的DS(Array,Dict…)上使用for循环,pythonic方法是迭代元素,而不是使用索引的“C”样式:)

在第一个版本中,有几个错误相互抵消。以下是无需手动增量的正确版本:

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)))

当循环被迭代时,手动增加计数器i和j不会改变计数器变量的状态。运行此代码以了解:

for i in range(1,5):
    print(i)
    i +=2
    print(i)
    print('**') 

输出:

1
3
**
2
4
**
3
5
**
4
6
**

相关问题 更多 >