Python中可能有无限的for循环吗?

Posted

技术标签:

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

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

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

【问题讨论】:

我在寻找类似的东西,发现了这个:***.com/questions/9884213/… Looping from 1 to infinity in Python的可能重复 【参考方案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.我认为它会失败是不正确的,请参阅***.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)

【讨论】:

您想改进您的帖子吗?如果是,***.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 就可以了。

以上是关于Python中可能有无限的for循环吗?的主要内容,如果未能解决你的问题,请参考以下文章

在实现无限循环时,使用 while(1) 与 for(;;) 与 goto (在 C 中)有区别吗?

js for循环不断循环无限[关闭]

使用空的 for 循环有啥问题吗?

无限for循环内的goroutine。这是一个好习惯吗?

Python使用for实现无限循环的多种方法

Python3入门基础(05)循环语句