【Python】無限ループさせるいくつかの方法

Python

この記事では、Pythonで無限ループするための方法を紹介します。

while文を使った無限ループ

while文の条件式に、常にTrueとなるデータを指定することで無限にループさせることができます。無限ループはbreakで抜けることができます。

サンプル

以下のコードは、「exit」と入力するまで無限ループします。

while True:

    s_i = input('文字を入力(終了: exit): ')

    if s_i == 'exit':
        break

実行結果

文字を入力(終了: exit): hshs
文字を入力(終了: exit): knkn
文字を入力(終了: exit): exit

itertools.count()を使った無限ループ

itertools.count()は、無限に値をカウントするイテレータを生成します。

使い方

import itertools

itertools.count(start, step)

引数のstartから始まるstep間隔の無限イテレータを作成します。これをfor文と組み合わせることで無限ループさせることができます。

while文と同様にbreakで処理を抜けます。

サンプル

while文と同様にbreakで処理を抜けます。

import itertools

for i in itertools.count():

    s_i = input('文字を入力(終了: exit): ')

    if s_i == 'exit':
        break

実行結果

文字を入力(終了: exit): hshs
文字を入力(終了: exit): knkn
文字を入力(終了: exit): exit

再帰関数を使った無限ループ

再帰関数とは、関数内で自らを呼び出す関数のことをいいます。

使い方

以下のように関数内で自らを呼び出します。

def func():
    func()

上記のコードは、無限ループから抜け出すことができないので、受け取った引数によって再帰的に関数を呼び出すか、呼び出さないかを分岐させたりします。

例えば、以下のような感じです。

def func(val):
    print(val)
    if val < 5:
        func(val + 1)

func(1)

実行結果

1
2
3
4
5

このように、再帰関数を使うことで無限ループさせることができます。

サンプル

他の無限ループと同じ処理を実装して違いを見てみましょう!

def func():
    s_i = input('文字を入力(終了: exit): ')
    if s_i != 'exit':
        func()

func()

実行結果

文字を入力(終了: exit): hshs
文字を入力(終了: exit): knkn
文字を入力(終了: exit): exit
POINT

Pythonには、再帰できる回数の上限が設定されています。再帰回数が多くなることが予想されたら、他の無限ループを使用した方が安全です。

iter()を使った無限ループ

iter関数を使うことでも無限ループさせることができます。

使い方

iter(呼び出し可能オブジェクト, sentinel)

第一引数に呼び出し可能なオブジェクト、第二引数にsentinelを指定します。

処理が繰り返されるたびに、呼び出し可能オブジェクトが引数無しで呼び出され、その戻り値がsentinelと等しければループが終了し、等しくなければ戻り値が返されます。

引数の呼び出し可能オブジェクトの戻り値とsentinelの値を等しくさせなければ無限ループさせることができます。

サンプル

iter関数は少し特殊なので色々な方法があります。

# 自作関数を使う方法
def func():
    s_i = input('文字を入力(終了: exit): ')

    return s_i

for i in iter(func, 'exit'):
    pass



# iter関数を無限ループとして使う方法
for i in iter(lambda: None, 0):
    s_i = input('文字を入力(終了: exit): ')

    if s_i == 'exit':
        break

どちらも結果は同じになります。

実行結果

文字を入力(終了: exit): hshs
文字を入力(終了: exit): knkn
文字を入力(終了: exit): exit

以下のように、直接input関数を渡すことでも同じような処理が出来ます。しかし、引数が指定できないので入力受付時にメッセージが表示できません。

for s_i in iter(input, 'exit'):
    pass

実行結果

hshs
knkn
exit

for文 + リストを使った無限ループ

繰り返し処理する度にfor文に指定するイテラブルオブジェクトに要素を追加していくことで無限ループさせることが出来ます。

val = 0

l = [None]

for i in l:

    print(val)
    val += 1
    if val < 5:
        l.append(None)

値が変化する過程を記録したい場合とかに使えますかね…?

サンプル

一応同じ処理を実装してみましょう!

l = [None]

for i in l:
    s_i = input('文字を入力(終了: exit): ')
    if s_i != 'exit':
        l.append(None)

実行結果

文字を入力(終了: exit): hshs
文字を入力(終了: exit): knkn
文字を入力(終了: exit): exit

まとめ

この記事では、Pythonで無限ループをする方法をいくつか紹介しました。

以下にそれぞれの特徴をまとめておきます。

while文万能?
itertools.count()カウント値を扱える
再帰関数再帰的に処理。回数に上限有り
iter()同時に関数を処理できる
for文+リスト過程のデータをとっておきたいなら有り?
タイトルとURLをコピーしました