Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
for循环用作while循环(python)_Python_Python 2.7_For Loop_While Loop - Fatal编程技术网

for循环用作while循环(python)

for循环用作while循环(python),python,python-2.7,for-loop,while-loop,Python,Python 2.7,For Loop,While Loop,我注意到在Python中,可以使用for循环来模拟while循环(我对编码知之甚少)。然后我尝试用两个不同的公式构造两个相同的while循环。在我看来,这里就是这样(是吗?) 其中,a不是最后一步中新索引[1,3]的一部分。 因此有三个问题: 两个程序#1和#2在开始时是否不同(例如,它们的计算工作量是否不同?) 程序#3中发生了什么(为什么在最后一步中“for a in index:”命令显然被忽略了?),以及for循环通常如何对更新索引中的更改作出反应 是否有关于将for循环用作while循

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

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

  • 两个程序#1和#2在开始时是否不同(例如,它们的计算工作量是否不同?)
  • 程序#3中发生了什么(为什么在最后一步中“for a in index:”命令显然被忽略了?),以及for循环通常如何对更新索引中的更改作出反应
  • 是否有关于将for循环用作while循环的一般指导原则(我注意到它在特定情况下很有帮助,所以我想知道这方面的一些一般提示)

  • 前两个基本相同,在不同的情况下,它们将运行相同数量的迭代,并将
    索引保持在相同的状态。如果将
    index.append(a+1)
    替换为
    index.append(a)
    ,则
    for
    循环将永远运行;类似地,如果将
    index.append(index[-1]+1)
    替换为
    index.append(index[-1])
    ,则
    while
    循环将永远运行。像这样修改迭代的列表有点令人担忧,但有时这是一种合理的策略

    顺便说一句,当你启动
    for
    循环时,会创建一个迭代器,给出
    索引[0]
    ,然后是
    索引[1]
    ,然后是
    索引[2]
    ,等等,直到它到达一个不存在的
    索引[N]
    。这个迭代器不知道也不关心您正在更改列表,因此如果您使列表变长,它将愉快地继续变长

    在程序3中,存在一些范围界定的混乱。当您输入for循环时创建的迭代器并不关心您在for循环中重新分配变量
    index
    :它只是在原始列表上不断迭代。当您在开始的几次执行
    index.append(a+1)
    时,会影响原始列表;但是,只要执行
    index=[1,3]
    index
    就不再引用原始列表,因此对它所做的任何操作都不会影响迭代的剩余过程。添加的最后一个值是
    5
    ,因为一旦
    a
    到达
    4
    并且
    a+1
    被追加到索引中,
    index
    被删除,不再追加到原始列表中


    最后,
    索引
    的重击在for循环之外持续存在:循环完成后,它将具有值
    [1,3]

    您对python答案或“常规”答案更感兴趣吗?python中没有很好地记录这种行为(仅此而已;讨论在)依赖它会让阅读你的代码的人感到困惑。使用更明确的
    while
    循环。理想情况下,您不应该修改正在迭代的集合的大小。while循环只是检查列表的最后一个值,而不是迭代contentagree with@cricket_007:for循环和while循环是不同的。若你们将反汇编代码,你们会看到循环设置迭代器,而循环并没有。为每个循环创建函数并用模块分解它们。“让我困惑的是,我认为一旦列表索引被更新/更改,for循环将从一开始就重新启动”,但事实并非如此。
    # 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)
    
    #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]