for
ループで無限ループを取得することは可能ですか?
私の推測では、Pythonには無限のforループが存在する可能性があります。将来の参考のためにこれを知りたいのですが。
Pythonでの無限ループの典型的な例は次のとおりです。
while True:
pass
これをforループに適用するには、ジェネレーター(最も単純な形式)を使用します。
def infinity():
while True:
yield
これは次のように使用できます。
for _ in infinity():
pass
要求に応じてforループを使用して質問に答えるには、1が0に等しくなることはないため、これは永久にループします。
for _ in iter(int, 1):
pass
最初の答えに従って増加している数値を使用して無限ループが必要な場合は、itertools.count
を使用できます。
from itertools import count
for i in count(0):
....
はい、常に別の数値を生成するジェネレータを使用します。ここに例があります
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)
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
itertools.count を試してみませんか?
import itertools
for i in itertools.count():
print i
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
ご覧のとおり、イテレータオブジェクトには、要素を返し、1回進む(可能な場合は、StopIteration例外を発生させる)a next
methodが必要です。
そのため、イテレータのnext
methodが決して例外を発生させないすべての反復可能なオブジェクトには、無限ループがあります。例えば:
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!
リストを使用するように構成できます。また、反復するたびにリストに要素を追加して、終了しないようにします。
例:
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
ループを取得できます。
これはいくつかのメモリの問題を引き起こす可能性があることを知っていますが、これは私が思いつくことができる最高のものです。