Categories: Python

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

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

無限ループと言えばwhile文を思い浮かべるかもしれませんが、実は Pythonにはwhile文以外にも無限ループさせる方法が用意されています。

while文は万能で使いやすいですが、状況に合った無限ループが扱えるように他の方法も頭の片隅に置いておきましょう。

それでは、無限ループさせる方法を見ていきましょう!

while文を使った無限ループ

while文を使った定番な無限ループです。

使い方

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

while 常にTrueの値:
    # 無限ループさせる処理

サンプル

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

while True:

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

    if s == 'exit':
        break

実行結果

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

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

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

使い方

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

import itertools

itertools.count(start, step)

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

サンプル

先ほどのサンプルをitertools.count()を使って書き直してみましょう!

import itertools

for i in itertools.count():

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

    if s == 'exit':
        break

実行結果

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

無限イテレータは他にも用意されています。気になる方は以下のリンクを参照してください。

Link無限イテレータを生成して使う

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

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

使い方

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

def func():
    func()

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

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

func(1)

実行結果

1
2
3
4
5

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

サンプル

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

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

func()

実行結果

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

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

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

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

使い方

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

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

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

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

サンプル

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

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

    return s

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



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

    if s == 'exit':
        break

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

実行結果

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

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

for s 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 = input('文字を入力(終了: exit): ')
    if s != 'exit':
        l.append(None)

実行結果

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

まとめ

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

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

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

それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

View Comments

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago