【问题标题】:How to repeat a for loop如何重复一个for循环
【发布时间】:2015-09-12 21:27:00
【问题描述】:

我遇到了一个 Python 问题。我试图不止一次地重复一个 for 循环。我在循环中有一个条件,如果条件为真,循环应该重新开始。我只需要一个 for 循环的解决方案。例如:

for i in range (10):
    if i==4:
        i=0
    print(i) 

很遗憾,这不起作用。

输出应该是:0 1 2 3 0 1 2 3 0 1 2 3...

【问题讨论】:

  • OP,一般来说,您尝试做的事情听起来是个坏主意。结构化编程通常不适用于gotocontinuebreak,更不用说随机摆弄循环索引了。关于这个主题有一个famous historic paper。另外,请考虑print [x % 4 for x in range(10)]以获得更 Pythonic 的方式 :)
  • @TobiaTesan continuebreak 有什么问题?
  • @mkrieger1 也许filternext 是更好的抽象。
  • @mkrieger1:关于它的文献很多,从 EWD 论文到 this one。 TL;DR 主要争论点是,提前退出通常会破坏结构化编程,而结构化编程是最干净的,只有 1 个入口和 1 个退出点。当然,有时break 在这里实际上是一个好主意,但我怀疑 OP 暂时远离它们会更好
  • 我用while试过了,但是TLE,所以我的算法可能会有问题

标签: python loops repeat


【解决方案1】:

在循环内写入循环变量 (i) 始终不是一个好主意(包括我熟悉的所有语言)。

尝试使用 while 循环:

i = 0
while i < 10:
    i += 1
    if i == 4:
        i = 0

同样的逻辑可以用:

while True:
    for i in range(4):
        print(i)

或者使用循环时常用的模运算符:

i = 0
while True:
    print(i % 4)
    i += 1

【讨论】:

    【解决方案2】:

    使用itertools.cycle的版本:

    from itertools import cycle
    
    for i in cycle(range(4)):
        # put your logic that `break`s the cycle here
        print(i) 
    

    【讨论】:

      【解决方案3】:

      在循环的底层将 through away 变量 i 转换为 0 并不意味着在下一次迭代中您的变量应该为 0,因为在每次迭代中,python 都会自动重新分配它。

      作为此类任务的更 Pythonic 方式,您可以使用 itertools.cycle

      >>> def range_printer(r,N): # r is the length of your range and N is the number of sequence printing 
      ...     a=cycle(range(r))
      ...     for i in range(N*r):
      ...         print next(a)
      ... 
      >>> range_printer(4,3)
      0
      1
      2
      3
      0
      1
      2
      3
      0
      1
      2
      3
      

      或者你可以使用yield返回一个生成器:

      >>> def range_printer(r,N):
      ...     a=cycle(range(r))
      ...     for i in range(N*r):
      ...         yield next(a)
      ... 
      >>> list(range_printer(4,3))
      [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]
      

      【讨论】:

      • 仍然 itertools.cycle 可能是 OP 想要/应该使用的。
      • 而且你不能真正改变 i 变量,因为它是由范围动态产生的。
      • 为什么人们总是说你不能改变(重新绑定)我?当然可以。在打印之前将 i 设置为 8,您会看到打印了 8。唯一的问题是 range 产生下一个值,与 i 设置的值无关。
      • @Veky 确实,但这是另一种情况,请检查编辑!并感谢您的关注!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2021-03-28
      • 1970-01-01
      • 2021-01-25
      • 2020-10-18
      • 2017-12-24
      • 1970-01-01
      相关资源
      最近更新 更多