Pythonの制御構文
プログラム制御とは
プログラムには基本となる処理として以下の3つがあります。
- 順次処理
- 条件分岐
- 反復処理
基本的に先頭から順次処理が行われ、条件分岐や反復処理に行き着いたら指定された条件式に応じた処理が順次行われます。
順次処理
先頭から順に処理が行われるということです。
プログラムは基本的に上の処理から順番に処理が行われます。
条件分岐
状態に応じて実行する処理が行われることを指します。
例えば、変数の値が10よりも小さい時にだけメッセージを表示するといった処理です。
反復処理
条件を満たしている間、何度も同じ処理が行われることを指します。
例えば、入力された値が10よりも小さい間何度も処理が行われるといった処理です。
制御構文
条件式と反復処理の構文に入る前に、条件式の書き方を説明したいと思います。
条件分岐と反復処理は特定の条件を満たす場合の処理を表現するために利用しますが、その時には条件を表す式を記述する必要があります。
条件式
制御構文により制御を行うために条件文を記述する必要があります。
制御処理は条件式の結果が「真」であるとその処理の分岐や反復を行います。
条件式は以下の比較演算子を利用して表現することができます。比較演算子には下表のものがあります。
式 | 説明文 | 補足 |
---|---|---|
a ==b | aとbが等しい | |
a != b | aとbが異なる | |
a < b | aはbより小さい | |
a > b | aはbより大きい | |
a <= b | aはb以下 | |
a >= b | aはb以上 | |
a is b | aとbが等しい | |
a is not b | aとbが異なる | |
a in b | aはbに含まれる | リストや文字列に使います |
a not in b | aはbに含まれない |
複数の条件式を組み合わせたい場合ブール演算子を利用します。ブール演算子には下表のものがあります。
式 | 説明 | 補足 |
---|---|---|
条件A and 条件B | AとBが真 | |
条件A or 条件B | AまたはBが真 | |
not 条件A | 条件Aが真でない |
条件分岐
ここからいよいよ条件分岐の書き方に入りたいと思います。条件分岐の書き方には以下の2つがあります。
- if
- match
if
ifは特定の条件を満たした場合に行いたい処理がある場合に利用します。
構文は以下になります。
以下の例では入力された文字が0であった場合にメッセージを出力するプログラムです。
in = input()
if in == '0':
print('0が入力されました')
ifの後にelifとelseで別の条件分岐を記載することができます。
elifは異なる条件を指定することができ、elseはそれまでに指定した条件以外の場合の処理を記述することができます。
例として以下のような複数の条件分岐を記述するときの例を示します。
- 0 の場合は「0が入力されました」を出力する
- 0より大きい場合は「0より大きい値が入力されました」を出力する
- それ以外の場合に「0より小さい値が入力されました」を出力する
この条件を実現するための記述方法は以下の通りです。
in = input()
if in == 0:
print('0が入力されました')
elif in > 0:
print('0より大きい値が入力されました')
else:
print('0より小さい値が入力されました')
match
matchは一つの変数や値がどの値と一致しているかを判定することができます。
下記はstatusに応じて、表示するメッセージを判断しています。
「case_」と記述するとそれ以外の場合ということを表しています。
match status:
case 400:
message = 'Bad Request'
case 404:
message = 'Not Found'
case _:
message = 'Internal Server Error'
ifとmatchどちらを使えばいいの?
ifとmatchはどちらも条件分岐をするための処理です。どちらかでしか書くことができない処理は基本的にはありません。
ではどう使い分けたらよいかというと私は以下のような使い分けをすると思います。
match:’一つの変数’が撮っている値が何かに応じて処理を記述したい場合
if :matchより複雑な条件を記述したい場合
反復処理
続いて反復処理です。反復処理であることを表す表現には以下の2つがあります。
- for
- while
for
for文はイテラブルオブジェクト・・・反復処理が行えるものを受け取ってその値の分だけ繰り返し処理を行います。基本的な型で反復処理が行えるのは以下のものです。
- string
- dict
- range
- array
例えばリスト(array)なら以下のように処理が行われます。
array = ['りんご','オレンジ','みかん']
for fruit in array:
print(fruit)
# りんご
# オレンジ
# みかん
# の順番で出力される
上記のようにfor文では反復可能な範囲で処理を繰り返し行うことができます。
while
whileは指定された条件が満たされる限り繰り返し処理を行います。
以下の場合、numが5よりも小さい間、繰り返し処理が行われます。
num = 0
while num < 5 :
num += 1
print(f'{num}回目の処理です')
それ以外の制御構文
制御構文には以下のように条件分岐でも反復処理でもないものがあります。
- break
- pass
- continue
break
breakはforやwhileのような反復処理から抜けることを表す制御文です。
以下はユーザーが入力した内容を出力するプログラムです。
whileの条件式はTrueであるため、通常であれば処理が無限に繰り返されます。しかし、ユーザーが入力した文字が「exit」であった場合にbreakでループを抜けることができます。
inparam = ''
while True:
inparam = input('Enter a parameter: ')
print(f'{inparam}が入力されました')
if inparam == 'exit':
break
pass
passは処理がないことを表す制御構文です。
…処理がないなら何も書かなければよいのでは?と思うかもしれませんがpythonのプログラムの書き方ではpassがなければ表現できないことがあります。
例えばステータスコードに応じた処理を行いたいとき、200の時はなにもしない。404の時は「何かが見つかりません」、500の時は「エラー」を表示するプログラムがあったとします。passを使わない場合は以下のように書くと思います。
match status:
case '200':
case '404':
print('何かが見つかりません')
case '500':
print('エラー')
しかし、これは実行することができません。
なぜならpythonではネスト(字下げ)が必要な記述をした場合、字下げされた命令文を書かなければならないからです。これはpythonの文法上の制約です。このような場合にpassという制御構文があります。
match status:
case '200':
pass
case '404':
print('何かが見つかりません')
case '500':
print('エラー')
continue
continueは次のループ処理から再開させるために利用します。これは反復処理をしたいが、特定の条件を満たした場合には処理を中断したいという場合に利用されます。
以下は1~10のうち、奇数の場合だけ奇数ですというメッセージを出力するプログラムです。
for i in range(10):
if i % 2 == 0
continue
print(f'{i}は奇数です')
さいごに
今回はPythonにおける制御構文をまとめました。
条件分岐は実現できる機能の幅が広がり、ループ処理は処理を効率よく書くことに特に役に立つ印象を持っています。
これまで紹介した基本的なデータ型、リスト、制御構文これらの要素があれば実はほとんどの処理を実現することが可能です。
例えば、かつてプログラミング初心者だったころの私はこれらの情報からオセロプログラムを作成しました。遊んだことがあるゲームのルールは大体実現することができるでしょう。