【问题标题】:Infinite for loops possible in Python?Python中可能有无限的for循环吗?
【发布时间】:2016-03-19 03:56:27
【问题描述】:

for循环中是否可以无限循环?

我的猜测是 Python 中可能存在无限的 for 循环。我想知道这一点以供将来参考。

【问题讨论】:

标签: python loops for-loop infinite-loop infinite


【解决方案1】:

是的,使用总是产生另一个数字的生成器: 这是一个例子

def zero_to_infinity():
    i = 0
    while True:
        yield i
        i += 1

for x in zero_to_infinity():
    print(x)

也可以通过改变你正在迭代的列表来实现这一点,例如:

l = [1]
for x in l:
    l.append(x + 1)
    print(x)

【讨论】:

    【解决方案2】:

    Python 中无限循环的典型示例是:

    while True:
        pass
    

    要将其应用于 for 循环,请使用生成器(最简单的形式):

    def infinity():
        while True:
            yield
    

    可以这样使用:

    for _ in infinity():
        pass
    

    【讨论】:

    • 嗯,但这是一个 while 循环,而不是一个 for 循环。
    • 完全没问题!不过我很感激。现在我知道 while 循环也可以是无限的! (:
    • @Britni.M 我已经更新了答案,以最简单的形式包含适当的生成器。
    • 1.我认为它会失败是不正确的,请参阅stackoverflow.com/questions/9860588/… 2。即使它通过溢出到较小的值而“失败”(就像在 C 语言中发生的那样)它仍然是无限的,只是数字不会是唯一的
    • @Jon 啊,很有趣。仍然是不必要的代码,但我已经更新了我的答案以删除不正确的断言。顺便说一句,我没有对你投反对票(我注意到有人过来投了我们俩的票,而我正在打字)。
    【解决方案3】:

    您可以使用iter() 的第二个参数重复调用函数,直到其返回值与该参数匹配。这将永远循环,因为 1 永远不会等于 0(这是 int() 的返回值):

    for _ in iter(int, 1):
        pass
    

    如果您想要一个使用递增数字的无限循环,您可以使用itertools.count

    from itertools import count
    
    for i in count(0):
        ....
    

    【讨论】:

      【解决方案4】:

      虽然有很多答案以及如何完成无限 for 循环的好例子,但没有人回答为什么(虽然没有被问到,但仍然......)

      Python 中的 for 循环是处理可迭代对象及其方法的迭代器对象的语法糖。例如,这是典型的 for 循环:

      for element in iterable:
          foo(element)
      

      这就是幕后发生的事情:

      iterator = iterable.__iter__()
      try:
          while True:
              element = iterator.next()
              foo(element)
      except StopIteration:
          pass
      

      可以看出,迭代器对象必须有一个next方法,该方法返回一个元素并前进一次(如果可以,否则它会引发 StopIteration 异常)。

      因此,每个 iterator'snextmethod 不会引发异常的可迭代对象都有一个无限的 for 循环。例如:

      class InfLoopIter(object):
          def __iter__(self):
              return self # an iterator object must always have this
          def next(self):
              return None
      
      class InfLoop(object):
          def __iter__(self):
              return InfLoopIter()
      
      for i in InfLoop():
          print "Hello World!" # infinite loop yay!
      

      【讨论】:

        【解决方案5】:

        在 Python 3 中,range() 可以更高,但不是无穷大:

        import sys
        
        for i in range(sys.maxsize**10):  # you could go even higher if you really want but not infinity
            pass
        

        【讨论】:

        • 这将创建一个 big 循环,是的,但不是无限循环,所以我认为它不能回答这个问题。我的意思是,是的,它可能会超过我们太阳的死亡,但是当有这么多好的解决方案创建实际上无限循环时,为什么还要麻烦呢?
        【解决方案6】:

        您可以将其配置为使用列表。并在每次迭代时将一个元素附加到列表中,这样它就永远不会结束。

        例子:

        list=[0]
        t=1
        for i in list:
                list.append(i)
                #do your thing.
                #Example code.
                if t<=0:
                        break
                print(t)
                t=t/10
        

        上面给出的这个确切的循环不会达到无穷大。但您可以编辑if 语句以获得无限的for 循环。

        我知道这可能会造成一些内存问题,但这是我能想到的最好的方法。

        【讨论】:

        • 我不认为它是无限的。它最终会耗尽内存或边界。
        【解决方案7】:

        在 Python 2.x 中,您可以:

        my_list = range(10)
        
        for i in my_list:
            print "hello python!!"
            my_list.append(i)
        

        【讨论】:

        • 您想改进您的帖子吗?如果是,stackoverflow.com/editing-help,但更重要的是添加一些解释。因为像这样的纯代码答案很少被认为是有帮助的。
        • 这确实不能回答问题。
        【解决方案8】:

        这是使用itertools 模块的另一个解决方案:

        import itertools
        
        for _ in itertools.repeat([]):  # return an infinite iterator
            pass
        

        【讨论】:

          【解决方案9】:
          n = 0
          li = [0]
          for i in li:
              n += 1
              li.append(n)
              print(li)
          

          在上面的代码中,我们遍历列表 (li)。

          • 所以在第 1 次迭代中,i = 0 并且 for 块中的代码将运行,即 li 在本次迭代中的索引 1 处将有一个新项目 (n+1),因此我们的列表变为 [0, 1]
          • 现在在第二次迭代中,i = 1 并且新项目被附加到 li (n+1),所以 li 变为 [0, 1, 2]
          • 在第 3 次迭代中,i = 2,n+1 将再次附加到 li,因此 li 变为 [ 0, 1, 2, 3 ]​​i>

          这将继续进行,因为在每次迭代中列表的大小都在增加。

          【讨论】:

          • 你可以不用变量n:li.append(len(li))
          • 我不认为它是无限的。它最终会耗尽内存或边界。
          【解决方案10】:

          还可以将内置函数 iter(另见 this answer)和 enumerate 组合成一个无限的 for 循环,它有一个计数器:

          for i, _ in enumerate(iter(bool, True)):
              input(i)
          

          哪些打印:

          0
          1
          2
          3
          4
          ...
          

          这使用iter 创建一个无限迭代器,enumerate 提供计数循环变量。您甚至可以使用enumeratestart 参数设置0 以外的起始值:

          for i, _ in enumerate(iter(bool, True), start=42):
              input(i)
          

          哪些打印:

          42
          43
          44
          45
          46
          ...
          

          【讨论】:

            【解决方案11】:

            其他解决方案存在一些问题,例如:

            • 消耗大量内存,这可能 导致内存溢出
            • 消耗大量处理器功率。
            • 造成死锁。
            • 使用第 3 方库

            这是一个可以解决这些问题的答案。

            from asyncio import run, sleep
            
            
            async def generator():
                while True:
                    await sleep(2)
                    yield True
            
            
            async def fun():
                async for _ in generator():
                    print("Again")
            
            
            if __name__ == '__main__':
                run(fun())
            

            如果您想做一些需要时间的事情,请将 sleep 替换为您想要的功能。

            【讨论】:

              【解决方案12】:

              我是 python 新手,但试试这个

               for i in range(2):
                       # your code here
                       i = 0
              

              可以改进这段代码

              【讨论】:

              • 这个循环将运行两次,所以我不确定它如何回答获得无限循环的问题......我猜你有在里面做i=0的想法循环将以某种方式“重置”循环变量,因此它将永远运行。这不是真的。您应该运行它并亲自查看...
              【解决方案13】:

              我们实际上可以有一个for无限循环

              list = []
              for i in list:
                 list.append(i)
                 print("Your thing")
              

              【讨论】:

              • 我不认为它是无限的。它最终会耗尽内存或边界。
              【解决方案14】:

              我找到了一种不使用 yield 或 while 循环的方法。 我的python版本是python 3.10.1

              x = [1]
              for _ in x:
                  x.append(1)
                  print('Hello World!')
              

              如果需要循环计数,可以使用 i+1:

              x = [1]
              for i in x:
                  x.append(i+1)
                  print(f'Hello {i}')
              

              您应该知道这并不是真正的“无限”循环。
              因为随着循环的运行,列表会增长,最终你会用完 ram。

              【讨论】:

              • 这个(imo bad)solution 已在此处的多个答案中显示,例如在answer by @DeepaRajesh 中。
              • @MartinPrikryl 如果您测试 DeepaRajesh 的答案,它实际上不起作用,列表的 len 必须至少为 1。
              • 是的。因此,请参阅@SahajOberoi 的答案。它仍然不是一个好的解决方案。简单的while True 就可以了。
              猜你喜欢
              • 2011-03-05
              • 2011-02-24
              • 1970-01-01
              • 1970-01-01
              • 2021-11-05
              • 2014-08-05
              • 2018-12-01
              • 2018-02-16
              相关资源
              最近更新 更多