Python入門 - ループ処理 while / for; 繰り返し処理を行う方法

作成日:

本ページではPythonの入門コンテンツとして初学者向けにPythonにおいて while文 および for文 を利用して繰り返し処理を行う方法について説明します。

要約#

  • 同じ処理を繰り返し行うために以下の命令が用意されている

    • while : 条件式がTrueの間処理を繰り返す

    • for : listdict といったデータに対して処理を繰り返す

繰り返し処理について#

プログラムでは繰り返して同じ処理を行いたい場合があります。例えば以下のような場合です。

  • 全く同じ処理を繰り返す

  • 数字だけが変化するが処理内容は同じものを繰り返す

  • 処理対象を変えながら処理を繰り返す

  • GUIなどでユーザからの入力を待ち続ける

  • etc.

例えば、 list`dict のすべての要素に対して同じ処理を実行したい場合などに同じようなコードを何度も書くのはやりたくないですね。 以下のような list の中身をすべて2倍にする、といった処理を行いたい場合似たようなコードを何度も書く羽目になります。

simple_list = [1, 2, 3, 4]

# すべての要素を2倍する
simple_list[0] *= 2
simple_list[1] *= 2
simple_list[2] *= 2
simple_list[3] *= 2

プログラミングではこういった似たようなコードを何度も記述するのは避けて、必要最低限のコードでなるべく動作させるものが良いとされます[1]

こういった場合の為にプログラミング言語側で仕組みを用意している場合がほとんどで、Pythonの場合 while というものと for という2種類の繰り返し向け命令が用意されています。

繰り返し処理のことをループ(loop)処理と呼ぶ場合もあります。

whileによる繰り返し処理#

繰り返し処理を記述する方式の1つとして while があります。

while の文構造#

while の構文は次のようになります。

while <条件式>:
    <条件式がTrueの間実行する命令>
else:
    <条件式がFalseとなった場合に実行する命令>

break による繰り返しの中断#

繰り返し処理を while の条件式として指定したものとは別に、途中で強制的に終了させたい場合があります。例えば以下のような場合です。

  • 繰り返し処理中にエラーを検出したため打ち切りたい場合

  • 実施したい処理内容が完了した場合

こういった場合には break という命令を利用します。 while 節の中でこの命令を実行することで while 節の中から抜け出すことができます。

break によって while の中から抜け出した場合には else の中の命令は実施されません。

continue による繰り返しの継続#

繰り返し処理自体は続行したいが、現在の処理はここで打ち切りにしたい、という場合に continue という命令が利用できます。 例えば以下のような場合です。

  • 繰り返し処理中にエラーを検出したが、残りの繰り返し処理は続行したい場合

  • 現在の繰り返しについてのみ実施したい処理内容が完了した場合

なれないうちは break と区別が難しいかもしれません。

実際の例を見てみる#

単純な例#

こちらは同じ処理を10回繰り返す繰り返し処理です。これは後述の for を使った方がスマートですが、簡単な繰り返しの例として載せます。

count = 0
while count < 10:
    print(f'count = {count}')
    count += 1

入力を待つ例#

こちらでは input() 関数の値を := により inp という名称の変数に代入しながら while 文に渡しています。

この :=ifwhile などの条件式で利用可能な式で 代入式 (assignment expression) と呼ばれます。変数に値を代入すると同時に、条件式の結果として代入した値を返す、という動作を行います。

下記の例では inp の内容が有効な文字列(空文字以外)である限り動作が続きます。 inp に空文字 '' が入った際には bool('') , つまり False となるので while から抜け出します。

while inp := input('何か入力してください : '):
    print(inp)

無限ループの例#

非常に単純に同じ処理を繰り返す例です。このコードはいわゆる無限ループというものを引き起こします。コードをコピーして実行する場合、自動的には終わらないので Ctrl+C を押して処理を中断する必要があります。

while True:
    print('繰り返し処理です')

elseを利用する例#

elsewhile の条件に合致しなくなった場合に実行される内容を記述する節です。

count = 9
while count < 10:
    print(f'count = {count}')
    count += 1
else:
    print(f'count is larger than 10: {count}')

ループを一度実施した後、 count10 よりも大きくなったため else 節の内容が実施されるのが確認できるかと思います。

breakを利用する例#

while を行っている間に break を利用して途中で抜け出す方法の例です。 else のコマンドは実行されないところにご注意ください。

count = 0
total = 0
while count < 10:
    print(f'count = {count} / total = {total}')
    count += 1
    total += count
    if total > 10:
        break
else:
    print(f'count is larger than 10: {count}')

while を実行している最中に total の合計が 10 を超えるため、 break が実行されているところが確認できるかと思います。

continueを利用する例#

while を行っている間に continue を利用してある処理についてのみ途中で終了する方法の例です。

count = 0
total = 0
while count < 10:
    print(f'count = {count} / total = {total}')
    count += 1
    if (total + count) % 2 == 0:
        continue
    total += count
else:
    print(f'count is larger than 10: {count}')

上記の例では total + count が偶数となる場合は continue が実行されるため total += count を実施しません。

forによる繰り返し処理#

繰り返し処理を記述するもう1つの方式として for があります。

forの文構造#

for の構文は次のようになります。

こちらは while のように条件式ベースで内容を記述するのではなく、 listdict などの イテラブル (iterable) なデータ(下記Note参照)の中身を順次見ていくという方式で繰り返し処理を実施していきます。

for <変数> in <式のリスト>:
    <式のリストの各要素に対して実施される命令>

ここでの <変数>for 節の中で利用する変数の名称になりますので、わかりやすい適当な名前を置いておけばよいです。

break による繰り返しの中断#

while と同様に for においても break を利用することで処理を中断して繰り返し処理から抜け出すことが可能です。

continue による繰り返しの継続#

こちらについても break と同様に for でも利用可能です。

実際の例を見てみる#

単純な例#

こちらは同じ処理を10回繰り返す繰り返し処理です。ここで以前シーケンス型の際に紹介した range が生きてきます。

for i in range(10):
    print(f'count = {i}')

range(10) により 0から9までの整数の数列が生成されますので、そのすべての要素について繰り返し処理が実施されているということですね。

listの中身を処理する例#

forlistdict の中身を処理するために利用されることが多いと思います。ここでは list に対する例を確認します。

simple_list = [1, 2, 3, 4, 5, 6]
for i in simple_list:
    print(f'{i} を2倍にすると {i*2} です')

dictの中身を処理する例(1)#

dict を単純に for の対象として設定すると、各要素のキーを取得することができます。従って for の中で要素の値にアクセスしたいときにはこのキーを指定してアクセスします。

simple_dict = {
    'C++': 'C言語を拡張したオブジェクト指向型言語',
    'Python': 'オブジェクト指向型プログラミングが可能なスクリプト言語',
    'FORTRAN': '世界初の高級プログラミング言語',
}
for key in simple_dict:
    print(f'{key} : {simple_dict[key]}')

dictの中身を処理する例(2)#

dict の各要素の値にわざわざキーを利用してアクセスするのが面倒な場合は、次のような書き方をすることでキーと値両方に簡単にアクセスしながら繰り返し処理を行うことができます。

simple_dict = {
    'C++': 'C言語を拡張したオブジェクト指向型言語',
    'Python': 'オブジェクト指向型プログラミングが可能なスクリプト言語',
    'FORTRAN': '世界初の高級プログラミング言語',
}
for key, value in simple_dict.items():
    print(f'{key} : {value}')

先ほどの例では simple_dict[key] と記述していた個所が value と非常に簡単な記述で済んでいるのがお分かりいただけると思います。ここでは アンパック という小技により tuple の中に含まれている2つのデータを keyvalue として利用しています。

まとめ#

本ページでは for および while を利用した繰り返し処理を行う制御について解説しました。

これにより似たようなデータに対して同一の処理を行うことが可能となり、より複雑なプログラムを簡単に記述できるようになります。

Python