既存のPythonリスト(list)を『無限ループ』に変換する方法です。
イテレータツールズのサイクルを使うのが便利でした。
Python の標準ライブラリです。
import itertools
iterator = itertools.cycle(['x', '+', '*', 'o'])
この iterator を『next()』や『for文』に渡したら、リストの内容を順番に、延々と取得することができました。
Python公式マニュアルの場所です。
itertools — 効率的なループ実行のためのイテレータ生成関数
itertools.cycle(iterable)
有限のリストを、無限リストのようにして使うことができます。
next()でリストを無限に取得する
有限のリストを itertools.cycle() で無限ループさせるコード例です。
next()関数を使って、リストの内容を何回でも取得できます。
Python マニュアル
組み込み関数 next(iterator[, default])
リストの代わりに、タプル(tuple)を使ってもOKです。
コード
next()で、リストの内容をくりかえし取得しています。
途中で元のリストを削除していますが、通常は消さなくて大丈夫です。
"""リストを無限にループするコード next()"""
import itertools
# リストを作成 (タプルでもOK)
datas = ['x', '+', '*', 'o']
# リストをループするイテレータを作成
datas_iterator = itertools.cycle(datas)
print('next()でイテレータを使う')
print(datas)
# 元のリストはいらないので削除
#(メモリ節約の必要がある場合のみ)
del datas
print(next(datas_iterator))
print(next(datas_iterator))
print(next(datas_iterator))
print(next(datas_iterator))
print(next(datas_iterator))
print(next(datas_iterator))
print(next(datas_iterator))
print(next(datas_iterator))
print(next(datas_iterator))
print(next(datas_iterator))
print('End')
実行結果
意図したとおり、リストの内容がループしています。
next()でイテレータを使う
['x', '+', '*', 'o']
x
+
*
o
x
+
*
o
x
+
End
for文でリストを無限に取得する
有限のリストを itertools.cycle() で無限ループさせるコード例です。
for文を使って、リストの内容を何回でも取得できます。
リストの代わりに、タプル(tuple)を使ってもOKです。
コード
for文で、リストの内容をくりかえし取得しています。
このままだと、永遠に終わりません。
そこで、enumerate()で連番を作り、上限を指定してブレークしています。
Python マニュアル
組み込み関数 enumerate(iterable, start=0)
途中で元のリストを削除していますが、通常は消さなくて大丈夫です。
"""リストを無限にループするコード for文"""
import itertools
# リストを作成 (タプルでもOK)
datas = ['x', '+', '*', 'o']
# リストをループするイテレータを作成
datas_iterator = itertools.cycle(datas)
print('for文でイテレータを使う')
print(datas)
# 元のリストはいらないので削除
#(メモリ節約の必要がある場合のみ)
del datas
for (n, data) in enumerate(datas_iterator):
# 要素を表示
print('n: %d %s' % (n, data))
# 上限を指定してbreak
if n >= 9:
break
print('End')
実行結果
意図したとおり、リストの内容がループしています。
for文でイテレータを使う
['x', '+', '*', 'o']
n: 0 x
n: 1 +
n: 2 *
n: 3 o
n: 4 x
n: 5 +
n: 6 *
n: 7 o
n: 8 x
n: 9 +
End
無限リストの用途
matplotlibのマーカー・線種・色の指定に便利だった
matplotlibでたくさんのデータ系列(けいれつ)をプロットするときに、無限リストが便利でした。
『マーカーの種類』、『線種(せんしゅ)』、『色』のリストをループさせることで、データ系列が増えても自動的にフォーマットを割り当てることができました。