【发布时间】:2016-03-19 03:56:27
【问题描述】:
for循环中是否可以无限循环?
我的猜测是 Python 中可能存在无限的 for 循环。我想知道这一点以供将来参考。
【问题讨论】:
-
我在寻找类似的东西,发现了这个:stackoverflow.com/questions/9884213/…
标签: python loops for-loop infinite-loop infinite
for循环中是否可以无限循环?
我的猜测是 Python 中可能存在无限的 for 循环。我想知道这一点以供将来参考。
【问题讨论】:
标签: python loops for-loop infinite-loop infinite
是的,使用总是产生另一个数字的生成器: 这是一个例子
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)
【讨论】:
Python 中无限循环的典型示例是:
while True:
pass
要将其应用于 for 循环,请使用生成器(最简单的形式):
def infinity():
while True:
yield
可以这样使用:
for _ in infinity():
pass
【讨论】:
您可以使用iter() 的第二个参数重复调用函数,直到其返回值与该参数匹配。这将永远循环,因为 1 永远不会等于 0(这是 int() 的返回值):
for _ in iter(int, 1):
pass
如果您想要一个使用递增数字的无限循环,您可以使用itertools.count:
from itertools import count
for i in count(0):
....
【讨论】:
虽然有很多答案以及如何完成无限 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!
【讨论】:
在 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
【讨论】:
您可以将其配置为使用列表。并在每次迭代时将一个元素附加到列表中,这样它就永远不会结束。
例子:
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 循环。
我知道这可能会造成一些内存问题,但这是我能想到的最好的方法。
【讨论】:
在 Python 2.x 中,您可以:
my_list = range(10)
for i in my_list:
print "hello python!!"
my_list.append(i)
【讨论】:
这是使用itertools 模块的另一个解决方案:
import itertools
for _ in itertools.repeat([]): # return an infinite iterator
pass
【讨论】:
n = 0
li = [0]
for i in li:
n += 1
li.append(n)
print(li)
在上面的代码中,我们遍历列表 (li)。
这将继续进行,因为在每次迭代中列表的大小都在增加。
【讨论】:
n:li.append(len(li))
还可以将内置函数 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
...
【讨论】:
其他解决方案存在一些问题,例如:
这是一个可以解决这些问题的答案。
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 替换为您想要的功能。
【讨论】:
我是 python 新手,但试试这个
for i in range(2):
# your code here
i = 0
可以改进这段代码
【讨论】:
i=0的想法循环将以某种方式“重置”循环变量,因此它将永远运行。这不是真的。您应该运行它并亲自查看...
我们实际上可以有一个for无限循环
list = []
for i in list:
list.append(i)
print("Your thing")
【讨论】:
我找到了一种不使用 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。
【讨论】:
while True 就可以了。