Pythonの制御構文
制御構文
プログラム制御とは
プログラムには基本となる処理として以下の3つがあります。
順次処理
条件分岐
反復処理
基本的に先頭から順次処理が行われ、条件分岐や反復処理に行き着いたら指定された条件式に応じた処理が順次行われます。
順次処理とは
先頭から順に処理が行われるということです。
プログラムは基本的に上の処理から順番に処理が行われます。
print('Hello')
print('World!')
条件分岐
状態に応じて実行する処理が行われることを指します。
例えば、変数の値が10よりも小さい時にだけメッセージを表示するといった処理です。
反復処理
条件を満たしている間、何度も同じ処理が行われることを指します。
例えば、入力された値が10よりも小さい間何度も処理が行われるといった処理です。
制御構文
条件分岐、反復処理の2つは特定の構文で処理を記述することで実行されます。
条件式
制御構文により制御を行うために条件文を記述する必要があります。
制御処理は条件式の結果が「真」であるとその処理の分岐や反復を行います。
条件式は以下の比較演算子を利用して表現することができます。比較演算子には下表のものがあります。
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が真ではない
条件分岐
if
ifによる条件分岐では以下のように記述することができます。
以下の例では入力された文字が0であった場合にメッセージを出力するプログラムです。
in = input()
if in == '0':
print('0が入力されました')
elifで別の条件分岐を記載することができます。
以下は以下の複数の条件分岐を記載したものです。
0 の場合に'0が入力されました'、
0より大きい場合は'0より大きい値が入力されました'、
それ以外の場合に'0より小さい値が入力されました'
最後のelseは厳密にはそのif文内で記述された条件以外の処理を定義することができます。
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'
pass
passは処理なしを表す命令文です。
例えば、ステータスが200の場合は何もしないとした場合、それ以外の場合は先の例と同じ処理を行うとします。
何も処理を書いていないため、これでよいかと思いますが、pythonではこの書き方が許されません。
case 200の下にはインデントが下がった何らかの命令文がなければなりません。そういう時に使うのがpassです。
match status:
case 200:
case 400:
message = 'Bad Request'
case 404:
message = 'Not Found'
case _
message = 'Internal Server Error'
match status:
case 200:
pass
case 400:
message = 'Bad Request'
case 404:
message = 'Not Found'
case _
message = 'Internal Server Error'
if と matchどっちを使えばいいの?
ifとmatchはどちらも条件分岐をするための処理です。どちらかでしか書くことができない処理は基本的にはありません。
ではどう組み合わせたらよいかというと私は以下のような使い分けをすると思います。
match
条件式を記述せずにある変数がとっている値がある値と合っているかを判定する場
具体的には左記の例のようにStatsusという変数に設定されているものが400か200か…という風に条件分岐をする場合です。
if
条件式を記述して判定を行う必要があるものはifを使います。
for
繰り返し処理を行うときに使います。
基本的な構文は以下になります。
for 変数名 in イテラブルオブジェクト:
処理
「イテラブルオブジェクト」とは反復可能なオブジェクトのことで以下のようなものを指します。
string
range
array
dict
例えばリストなら以下のように処理が行われます。
array = ['りんご','オレンジ','みかん']
for fruit in array:
print(fruit)
# りんご
# オレンジ
# みかん
# の順番で出力される
while
特定の条件が満たされる限りループ処理を行います。
基本的な構文は以下になります。
while 条件式 :
処理
break
forやwhileなどのネストから抜けることを表現します。
以下のコードはwhileの条件は常にTrueであるため無限ループになります。
しかし、5になったら処理を抜けるためにbreakが実行されループを抜けられるようになっています。
num = 0
while true :
num += 1
if num == 5:
break
continue
次のループ処理を行うための命令文です。
以下の処理はcontinueを使った処理のサンプルです。
渡されたリストのうち、2の倍数のみメッセージを出力します。
一見して常にprint処理が行われるように見えますが、2の倍数でない場合はcontinueが実行されるようになっています。
continueが行われるとその時点でループ処理が中断され、次の要素を用いたループ処理から処理が再開されます。これにより、2の倍数の時だけメッセージを出力されるようになっています。
array = [1,2,3,4,5]
for i in array:
if i % 2 != 0:
continue
print(f'iは2の倍数です')
さいごに
今回はPythonにおける制御構文をまとめました。
条件分岐は実現できる機能の幅が広がり、ループ処理は処理を効率よく書くことに特に役に立つ印象を持っています。
これまで紹介した基本的なデータ型、リスト、制御構文これらの要素があれば実はほとんどの処理を実現することが可能です。
例えば、かつてプログラミング初心者だったころの私はこれらの情報からオセロプログラムを作成しました。
遊んだことがあるゲームのルールは大体実現することができるでしょう。