Python中可能存在无限循环?

Python中可能存在无限循环?,python,loops,for-loop,infinite-loop,infinite,Python,Loops,For Loop,Infinite Loop,Infinite,是否有可能在for循环中获得无限循环 我猜想Python中可能有一个无限的for循环。我想知道这一点以备将来参考。是的,请使用始终生成另一个数字的生成器: 这里有一个例子 def zero_to_infinity(): i = 0 while True: yield i i += 1 for x in zero_to_infinity(): print(x) 也可以通过改变正在迭代的列表来实现这一点,例如: l = [1] for x

是否有可能在
for
循环中获得无限循环


我猜想Python中可能有一个无限的for循环。我想知道这一点以备将来参考。

是的,请使用始终生成另一个数字的生成器: 这里有一个例子

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)
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!

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

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

这可以按如下方式使用:

for _ in infinity():
    pass

要按要求使用for循环回答您的问题,这将永远循环,因为1永远不会等于0:

for _ in iter(int, 1):
    pass
如果您想要使用按照第一个答案递增的数字进行无限循环,您可以使用
itertools.count

from itertools import count

for i in count(0):
    ....

虽然有很多关于如何实现无限for循环的好例子,但没有一个回答为什么(虽然没有被问到,但仍然…)

Python中的for循环是处理iterable和its方法的迭代器对象的语法糖。例如,这是典型的For循环:

for element in iterable:
    foo(element)
这就是幕后发生的事情:

iterator = iterable.__iter__()
try:
    while True:
        element = iterator.next()
        foo(element)
except StopIteration:
    pass
可以看出,迭代器对象必须具有一个
next
方法,该方法返回一个元素并前进一次(如果可以,否则会引发StopIteration异常)

所以迭代器的
next
方法不会引发上述异常的每个iterable对象都有一个无限for循环。例如:

l = [1]
for x in l:
    l.append(x + 1)
    print(x)
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!
使用:

在Python3中,range()可以高得多,但不是无限大:

import sys
for i in range(sys.maxsize**10):  # you could go even higher if you really want but not infinity
    pass
另一种方法可以是

def to_infinity():
    index=0
    while 1:
        yield index
        index += 1

for i in to_infinity():
    pass

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

例如:

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
list=[0]
t=1
对于列表中的i:
列表.附加(i)
#做你的事。
#示例代码。
如果t为什么不试试

它将从0开始打印数字到

试试看

**我意识到自己晚了几年,但这可能会帮助其他人:)

my_list=range(10)
对于我的_列表中的i:
打印(“hello python!!”)
我的清单。附加(i)

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

导入itertools
对于itertools.repeat([]):#返回一个无限迭代器
通过
在上面的代码中,我们迭代列表(li)

  • 因此,在第一次迭代中,i=0,for块中的代码将运行,也就是说,在这个迭代中,li将在索引1处有一个新项(n+1),因此我们的列表变为[0,1]
  • 现在在第二次迭代中,i=1,新项被附加到li(n+1)中,因此li变成[0,1,2]
  • 在第三次迭代中,i=2,n+1将再次附加到li,因此li变成[0,1,2,3]

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

还可以组合内置函数(另请参见)和具有计数器的无限
for
循环:

枚举(iter(bool,True))中i的

投入(一)
其中打印:

0
1
2
3
4
...
42
43
44
45
46
...
这使用
iter
创建一个无限迭代器,
enumerate
提供计数循环变量。您甚至可以使用
enumerate
start
参数设置
0
以外的开始值:

对于i,在枚举中(iter(bool,True),start=42):
投入(一)
其中打印:

0
1
2
3
4
...
42
43
44
45
46
...

哦,这是有道理的!现在,我将在Python中尝试这一点。谢谢你的快速回答。我添加了一个演示。如果你选择这个作为最佳答案会更好。嗯,但是这是一个while循环,不是for循环。这完全可以!不过我很感激。现在我知道while循环也可以是无限的!(:@Britni.M我已经更新了答案,以最简单的形式包含了一个合适的生成器。1.我认为您认为它会失败是不对的,请参见2。即使它确实通过溢出到较小的值而“失败”(在C语言中会发生这种情况)它仍然是无限的,只是数字不是无限的unique@Jon啊,很有意思。仍然是不必要的代码,但我已经更新了我的答案,删除了错误的断言。顺便说一句,我没有投你的反对票(我注意到有人过来,在我打这个时投了我们两人的反对票)。
iter(int,1)
是避免lambda的一种方法。我在寻找类似的东西时发现:您希望改进您的帖子吗?如果是,但更重要的是添加一些解释。因为只有这样的代码答案很少被认为是有用的。这真的不能回答问题。当我们使用
itertools.c时count
生成器,迭代计数器增长,整数占用越来越多的内存。考虑到这一点,在
itertools上迭代的解决方案将是最佳选择。重复
生成器将是最佳选择。您可以不使用变量
n
li.append(len(li))
@ack是的,谢谢这个想法。