for循环用作while循环(python)

时间:2018-02-14 01:04:47

标签: python python-2.7 for-loop while-loop

我注意到在Python中可以使用for循环来模拟while循环(我对编码知之甚少)。然后我尝试使用两种不同的配方构建两个相同的while循环。在我看来,这就是这种情况(是吗?)

# for-loop formulation
index = [0]
for a in index:
    if a < 6:
       index.append(a + 1) 

# while-loop formulation
index = [0]
while index[-1] < 6:
    index.append(index[-1] + 1)

让我感到困惑的是,我认为一旦列表索引被更新/更改,for-loop将从头开始重新启动,因为列表可能在任何周期都发生了显着变化。例如,如果你运行

#3
index = [0]
for a in index:
    print a
    if a < 6:
       index.append(a+1)
       if a > 3:
           index = [1, 3]
    print index

你得到了输出

0
[0, 1]
1
[0, 1, 2]
2
[0, 1, 2, 3]
3
[0, 1, 2, 3, 4]
4
[1, 3]
5
[1, 3]

其中a不是最后一步中新索引[1,3]的一部分。 因此有三个问题:

  1. 两个程序#1和#2的开头是不同的(例如,他们的计算工作量是否不同?)
  2. 程序#3中发生了什么(为什么在索引中显示&#39;&#39;命令在最后一步中显然被忽略了?),以及for循环如何对更新中的更改做出反应索引一般吗?
  3. 是否有关于使用for循环作为while循环的一般指导原则(我注意到我发现它在特定情况下有用,所以我想知道这个方向的一些常规技巧)。

1 个答案:

答案 0 :(得分:1)

前两个基本相同,因为它们将在各种情况下运行相同数量的迭代,并使index处于相同状态。如果您将index.append(a+1)替换为index.append(a),则for循环将永久运行;同样,如果您将index.append(index[-1] + 1)替换为index.append(index[-1]),则while循环将永久运行。修改一个你正在迭代的列表有点令人讨厌,但它有时是一种合理的策略。

顺便说一下,for循环发生了什么,当你启动它时,会创建一个迭代器,它提供index[0],然后是index[1],然后是index[2]等等,直到它到达不存在的index[N]。这个迭代器不知道或不关心您是否正在更改列表,因此如果您使列表更长,它将会更快地继续下去。

在程序#3中,存在一些范围混淆。进入for循环时创建的迭代器并不关心你是否在for循环中重新分配变量index:它只是继续迭代原始列表。前几次执行index.append(a+1)时,确实会影响原始列表;但是只要你index = [1, 3] index5就不再引用原始列表了,所以你对它做的任何事都都不会影响剩余的迭代过程。添加的最后一个值是a,因为一旦4到达a+1并且index被附加到索引,index就会遭到破坏,并且不会再附加任何内容到原始列表。

最后,[1, 3]的破坏在for循环之外持续存在:循环完成后它将具有值$.ajax({ type: 'POST', url: 'echodata.php', data: form_data, dataType:"json", success: function(data){ $('#table').append('<tr><td>'+data.agent_name+'</td>' // + more columns ... +'</tr>');} );