条件分岐とコードブロック

概要

image

条件分岐は「ある条件Aを満たす場合にBをする」といったかたちで、 特定の条件に応じてプログラムの動きを変えるためのPythonの文法です。

条件分岐にはif/elif/elseの構文を使い、それぞれ「条件を満たすなら処理をする」 「それより上の条件分岐を満たしておらず、この条件を満たすなら処理をする」 「どの条件も満たさなければ処理をする」という役割を持ちます。 if文は必須ですが、elifとelseは必ずしも必要ありません。 そしてelifは好きなだけ使えますが、ifとelseは1つまでです。

プログラムの実行グループはコードブロックと呼ばれており、 Pythonはそれをインデントで記します。 C言語やJavaのように中括弧「{}」でコードブロックを書くのではなく、 インデントを強制しているため見た目が綺麗になるという特徴があります。

条件分岐

プログラムの基本的な流れは上から下へ一行ずつ実行していくというものです。 単純なプログラムですと、プログラムファイルに実施する処理を順番に羅列するだけで実現できます。 ただ、少し複雑なプログラムになると「上から下に順番に実行していく」というだけでは処理を実現できません。

たとえば、天気予報を確認するアプリを考えてみます。 「今日が晴れなら晴れマークを表示、雨なら雨マークを表示」といった具合に 「あるものがAならBをする。そうでないならCをする」という「条件」に応じて処理が「分岐」します。 こういった処理のことを「 条件分岐 」と呼び、多くのプログラミング言語でサポートされます。

image

条件分岐は、条件分岐の式を満たすか満たさないかで実行される処理が変わるという制御構造です。 Bool型の値が条件判定に利用され、それがTrueなら処理Aをし、Falseなら処理Bをするといった形で、 条件により実行するプログラムが変わります。

if文

Pythonだけでなく多くのプログラミング言語は条件分岐を「 if文 」で実現します。 if文のあとに「 条件式 」を書き、その条件式が満たされる場合にif文の処理が実行されます。

条件式は「Bool型の値」として判定されるコードで、 一般的には「Bool値を持つ変数」や「比較演算子を使った式」が使われます。 文法としては以下のように使います。

if 条件式:
  条件式がTrueの時に実行される処理

ifのあとに条件式を書き、それに続けてコロン「:」を書きます。 そのあとで改行及びインデント(字下げ)をし、条件式がTrueになる場合に実行される処理を書きます。

実際のPythonのプログラムですと以下のようになります。

a = 5
if 10 > a:
  print('True: 10 > a')
True: 10 > a

上記の「10 > a」が条件式で、これがTrueとなればif文の次の行の処理が実行されます。 aには5が代入されているため、「10 > 5」はTrueとなり、その次のprint文が実行されています。

aに代入する値を100に変えて、再度プログラムを実行してみます。

a = 100
if 10 > a:
  print('True: 10 > a')

今度は「10 > a」のaに100が代入されているため、条件式はFalseとなります。 そのため、if文の次の行(条件式がTrueの場合だけ実行される)が実行されず、print文の出力がありません。

image

コードブロック

先ほどの例ではif文が条件を満たす場合の処理を細かい説明なしに1行だけとしました。 ただ、複雑なプログラムではif文の処理も複雑になるため複数行の処理を実行する必要がでてきます。

その際にif文が「どこからどこまでをカバーしているか」をプログラムに教えてあげる必要があります。 プログラミングでは条件分岐といったある特定の処理の「対象範囲」を「 コードブロック 」で示します。

Pythonではコードブロックを「 インデント(字下げ) 」を揃えることで実現しています。 具体的には以下のようなものです。

処理1
if 条件式:
   # ここから
   処理2
   処理3
   # ここまでがコードブロック
処理4

上記の例ではif文の後にif文のコードブロックが続き、 どこからどこまでが対象になるかをインデントで示しています。 処理2と処理3は同じインデントレベル(深さ)で字下げされているので、同じコードブロックに属しています。

Pythonのインデントの仕方は「半角空白を4つ」が標準で、それに次いで半角空白2つも一般的です。 タブでインデントをすることは推奨されておりませんが使えます。 ただ、半角空白とタブを併用したインデントは避けて下さい。

具体例としては以下のようなものになります。

a = 5
print(1)
if 10 > a:
  print(2)
  print(3)
print(4)
1
2
3
4

変数aに5が代入されているため、条件分岐で「10 > a」が満たされます。 そのためif文に属さない「print(1)」に続いて、if文の処理である「print(2)」と「print(3)」が実行されます。 その後にある「print(4)」はif文のコードブロック外なので、if文の条件式に関わらず実行されます。

aに代入する値を100に変えて、条件式がFalseになる状態でプログラムを再度実行してみます。

a = 100
print(1)
if 10 > a:
  print(2)
  print(3)
print(4)
1
4

if文のコードブロックに属する「print(2)」と「print(3)」が実行されなくなりましたが、 コードブロックの範囲外である「print(1)」と「print(4)」は実行されています。

コードブロックのネスト

コードブロックの中にコードブロックを作ることも可能です。 たとえばif文による条件分岐の中に、さらにif文の条件分岐を作るといった具合です。 コードブロックに限らず、プログラミングで「入れ子」構造にすることを一般的に「 ネスト 」すると言います。

Pythonはコードブロックをインデントレベル(深さ)で示しますので、 コードブロックの中のコードブロックはインデントレベルが1つ深くなります。 具体的には以下のようになります。

if 条件式A:
  処理1
  if 条件式B:
    処理2
  処理3

条件式Bを持つif文のコードブロックは、条件式Aのif文のコードブロックの中にあります。 コードブロックの中のコードブロックに属する処理2はインデントレベルが一つ下がっています。

実際のコードでは以下のようになります。

a = 5
b = 5
print(1)
if 10 > a:
  print(2)
  if 10 > b:
    print(3)
  print(4)
print(5)

変数の値を変更した際に、プログラムがどのように動くかを以下に図で記載します。

image

「print(2)」「print(3)」「print(4)」はすべて「if 10 > a:」のコードブロックに属しています。 ただ、「print(3)」はそれに加えて「if 10 > b:」のコードブロックにも属しています。

内側のコードブロックは外側のコードブロックが実行される場合のみ実行されます。 そのため、たとえ「if 10 > b:」がTrueになったとしても、 「if 10 > a:」がFalseになる場合は判定すらされませんので処理は実行されません。

コードブロックのネストは深くなるとプログラムが読みにくくなります。 深いレベルのネストが必要な状況になってきたら、 アルゴリズムそのものを見直すか後のページで扱う関数に処理を分割するなどして、 ネストのレベルを下げるようにしてください。

else文

ある条件を満たす場合の処理だけでなく、条件を満たさない場合の処理を定義することもできます。 if文のコードブロックに続けて「 else文 」を書くことで、 if文の条件に合致しなかった場合にelse文のコードブロックの処理が実行されます。 elseのコードブロックはif文に合致した場合は実行されません。

image

a = 100
if 10 > a:
  print('True: 10 > a')
else:
  print('False: 10 > a')
False: 10 > a

else文はif文と組み合わせて使用され、省略しても構いません。

image

elif

if文の条件に合致しない場合でも、別の条件式に合致するか確認したい場合があります。 そのような場合に「 elif文 」を使えます。

たとえばテストの点数の採点で「80点以上で優」「60点以上で合格」「それ以下で不合格」という判定をしたいとしましょう。 そのようなときは「ifで80点以上かをチェック」「elifで60点以上かをチェック」「elseでそれ以外は不合格とする」とできます。

image

elif文の使い方はif文と全く同じです。 elif文に続けられた条件式が満たされれば、elif文のコードブロックが実行されます。

a = 70
if 80 <= a:
  print('Pass, Good')
elif 60 <= a:
  print('Pass')
else:
  print('Fail')
Pass

elif文は必ずif文の後に続きます。 好きなだけ宣言することができるため、0個でも100個書いても構いません。

elseを書く場合は必ずelifの後に続きます。

image