【问题标题】:Like while loops, how can I skip a step in a for loop?像 while 循环一样,我怎样才能跳过 for 循环中的一个步骤?
【发布时间】:2020-03-11 07:52:18
【问题描述】:

我尝试跳过 for 循环中的几个步骤,例如 while 循环。

在while循环中,将步骤调整为具体条件,如下代码所示。

i = 0 
while i <10:
    if i == 3:
        i = 5
    else:
        print(i)
    i = i + 1
#result 0 1 2 6 7 8 9

但是,我尝试以同样的方式调整 for 循环的步骤,但失败了。

for i in range(10):
    if i == 3:
        i = 5
    else:
        print(i)
#result 0 1 2 4 5 6 7 8 9

我不能在 for 循环中直接控制步骤 'i' 吗?

如果有办法,请告诉我,我将不胜感激。

【问题讨论】:

  • 否,但您可以在要跳过的迭代中continue
  • 您要解决什么问题?看来你是从错误的角度攻击它。

标签: python for-loop


【解决方案1】:

在循环体中更改i 无效,因为它会在每次迭代时自动分配“range() 结果中的下一个值”。您可以改为在要跳过的值上使用 continue

for i in range(10):
    if 3 <= i <= 5:
        continue
    else:
        print(i)

【讨论】:

    【解决方案2】:

    不,你不能。在循环的每次新迭代中,for i in range(10) 语句中的 i 变量都会重新计算。

    【讨论】:

      【解决方案3】:

      虽然@soulmerge 的答案有效,但如果您要跳过的迭代次数过多,则可能效率低下,在这种情况下,您可以构建您想要迭代的确切序列:

      for i in (*range(3), *range(6, 10)): # imagine the case of (*range(3), *range(996, 1000))
          print(i)
      

      或者更高效,使用itertools.chain 来避免先构建元组:

      from itertools import chain
      for i in chain(range(3), range(6, 10)):
          print(i)
      

      【讨论】:

        【解决方案4】:

        在 C 语言中,i 是一个在 for 循环结束时递增的变量,您可以自己更改它,但是在 Python 中,for 循环的运行方式类似于生成器生成的其他语言的 foreach 循环结果和下一个结果用于每次迭代。

        在这种情况下,如果您需要使用for(each) 循环,您可以使用 continue 跳过您想错过的迭代:

        if i >= 3 and i <= 5:
            continue
        

        请记住,forforeach 循环只是 while 循环的语法糖,最终它实际上是 goto label 的语法糖(是的,这有一些语言例外,但最终是汇编是goto)

        【讨论】:

          【解决方案5】:

          我不确定我是否理解你的问题,但也许你正在寻找继续声明

          While i < 10 :
              if i == 4 or i == 3 :
                  continue
          

          在这段代码中,当 i = 4 或 3 时跳过循环

          【讨论】:

          • 我想你把pass 误认为continue:前一个语句只会被解释器忽略,而后一个语句会导致循环“进入下一个循环”。见这里:stackoverflow.com/a/9484008/44562
          猜你喜欢
          • 1970-01-01
          • 2023-02-05
          • 2022-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-13
          • 2014-06-18
          • 1970-01-01
          相关资源
          最近更新 更多