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'snext
method 不会引发异常的可迭代对象都有一个无限的 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
提供计数循环变量。您甚至可以使用enumerate
的start
参数设置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循环吗?的主要内容,如果未能解决你的问题,请参考以下文章