この記事では、Pythonで無限ループさせる方法を紹介します。
無限ループと言えばwhile
文を思い浮かべるかもしれませんが、実は Pythonには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()
は、無限に値をカウントするイテレータを生成します。
使い方
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()
関数を使うことでも無限ループさせることができます。
使い方
第一引数に呼び出し可能なオブジェクト、第二引数に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文に指定するイテラブルオブジェクトに要素を追加していくことで無限ループさせることが出来ます。
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