Python中无限循环可用吗?

问题描述 投票:6回答:6

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

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

python loops for-loop infinite-loop infinite
6个回答
8
投票

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

while True:
    pass

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

def infinity():
    while True:
        yield

这可以使用如下:

for _ in infinity():
    pass

5
投票

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

for _ in iter(int, 1):
    pass

如果你想使用按照第一个答案递增的数字进行无限循环,你可以使用itertools.count

from itertools import count

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

4
投票

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

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
投票

使用itertools.count

import itertools
for i in itertools.count():
    pass

在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

0
投票

虽然有很多答案可以解释如何完成无限循环,但是没有人能够回答原因(尽管如此,它仍未被问到,但仍然......)

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

for element in iterable:
    foo(element)

这就是幕后发生的事情:

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

正如可以看到的那样,迭代器对象必须具有anextmethod,它返回一个元素并前进一次(如果它可以,否则它会引发StopIteration异常)。

因此,迭代器的nextmethod永远不会引发异常的每个可迭代对象都有一个无限循环。例如:

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!

0
投票

您可以将其配置为使用列表。每次迭代时都会向列表中附加一个元素,以便它永远不会结束。

例:

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循环。

我知道这可能会产生一些内存问题,但这是我能想到的最好的问题。

© www.soinside.com 2019 - 2024. All rights reserved.