[Python] if文による条件分岐

ここでは、pythonプログラミングの基本である、if文について解説します。まずは、Google Colaboratoryの使い方 を参考に、プログラミングの環境に移動しましょう。ローカルに環境を構築している方は、そちらでもokです。

if文について

プログラムを組む際、条件によって処理を変えなければならないことは良くあります(例えば、居酒屋にある自動注文システムで、はじめに年齢を入力させておき、未成年であればお酒提供しない、そうでなければお酒を提供する、など)。このようなシステムを構築したい場合に、if文を利用します。

if文を理解するために、以下のコードを実行してみてください。

age = 30
if age >= 20:
 print("20歳以上です。")

これを実行すると、「20歳以上です。」と表示されるはずです。続いて、ageに代入する値を30から15に変更してみましょう。

age = 15
if age >= 20:
 print("20歳以上です。")

今度は何も表示がされなかったと思います。これを理解するには、2行目の挙動を知る必要があります。2行目には「if age >= 20:」という記述があります。これは「もし age が20以上ならば」という意味があり、それを満たす場合のみ、インデントされた領域を実行する、という意味があります。

if文直下の1行だけではなく、インデントされた領域すべてが実行対象となるので、下記のように2行分インデントしていれば、if文に当てはまる場合のみ、2行とも実行されます。

age = 30
if age >= 20:
 print("20歳以上です。")
 print("お酒を提供できます。")

インデントされていない箇所は、if文の条件に当てはまらなくても必ず実行されてしまうので、注意しましょう。例えば、以下のコードは、エラーにはなりませんが、誤りです。

age = 30
if age >= 20:
 print("20歳以上です。")
print("お酒を提供できます。")

何歳であろうとも、「お酒を提供できます。」と表示されてしまいます(試しに、age=15などにしてみるとそれを確認できます)。

ちなみに、

  • 2行目の if と : の間にある「age>=20」のような記述を、条件式
  • 条件式が成立することを、True(トゥルー)、真(しん)、1
  • 条件式が成立しないことを、False(フォールス)、偽(ぎ)、0

と呼びます。プログラマはよく使う言葉なので是非覚えると良いです。

条件式の書き方

条件式は、とても多くの種類があります。ここでは必須となるいくつかの条件式のみ説明します。以下、それらの構文となります。

記述方法意味
if a == b:aとbが等しいならば
if a != b:aとbが異なるならば
if a > b:aがbよりも大きいならば
if a >= b: aがb以上ならば
if a < b:aがbよりも小さいならば
if a <= b:aがb以下ならば

注意してほしい箇所は、等しいかどうかの判定に、イコールを2つ並べている点です。これまで説明した通り、イコール1つは、右辺を左辺の変数に代入するという役割でしたから、イコール一つで等しいかどうかの判定はできません。

実際に、これらを活用してコードを書いてみます。

a = 100
b = 200

if a==b:
 print("aとbは等しい。")

if a!=b:
 print("aとbは等しくない。")

if a>b:
 print("aはbよりも大きい。")

if a>=b:
 print("aはb以上")

if a<b:
 print("aはbよりも小さい。")

if a<=b:
 print("aはb以下")

aとbにいくつか数字を入れて、挙動をチェックしてみてください。適切に動作していることが確認できると思います。以上・以下という言葉は、2つの数字が等しい場合もTrue判定となるので、そこだけは注意してください。

if-elif文

if文でTrue判定とならなかった場合のみに、別の条件式で判定させたいことがしばしば発生します。このような場合、if-elif文を利用します。これを理解するために、以下のコードを実行してください。

age = 15
if age >= 20:
 print("20歳以上です。")
 print("お酒を提供できます。")
elif age < 20:
 print("20歳未満です。")
 print("お酒を提供できません。")

5行目にelifという記述があります。これは、「else if」の略で「そうではなく、もし」という意味があります。したがって、

  • 2行目: もしageが20以上ならば、
  • 5行目: そうではなく、もし20未満ならば、

という条件判定を行なっていることになります。

if-else文

if文でTrueとならなかったすべての場合において、何らかの処理を必ず実行したいことが、しばしば起こります。このような場合、if-else文を利用します。これを理解するために、以下のコードを実行してみましょう。

age = 15
if age >= 20:
 print("20歳以上です。")
 print("お酒を提供できます。")
else:
 print("20歳未満です。")
 print("お酒を提供できません。")

5行目にelseという記述があります。else文は上に記載しているif文の条件でFalseとなったあらゆる場合に実行される処理となります。したがって、elif文とは異なり、else文の場合は何も条件式を入れません。

if-elif文を利用したアプリケーション

これまでの説明を参考にして、簡単なアプリケーションを作ってみます。機能は以下の通りです。

  • ユーザーが年齢を入力する。
  • もし20歳以上ならば、「お酒を提供できます。」と表示する。
  • そうではなく、もし20歳未満ならば、「お酒を提供できません。」と表示する。
  • 20歳未満の場合は、20歳になるまで不足している年数を表示する。

これを実現するコードが、下記となります。

print("年齢を入力してください。")
str_age = input()
float_age = float(str_age)

if float_age >= 20:
 print("お酒を提供できます。")

elif float_age < 20:
 print("お酒を提供できません。")
 shortage_age = 20 - float_age
 print("あと", shortage_age, "年足りません。")

8行目はelifではなく、elseを使っても構いません。なお、不足する年齢を計算している部分が10行目となります。

if文を利用した型チェック

実際にシステムを開発するようになるまであまり使う機会はありませんが、if文を利用すれば型がなんなのかチェックすることも可能です。これが、以下のコードです。

a = 32
if type(a) == int:
 print("変数aはint型です。")
if type(a) == float:
 print("変数aはfloat型です。")
if type(a) == str:
 print("変数aはstr型です。")

int, float, strは変数ではなく、特別に定められた記号です。

and による条件式の結合

プログラムを組んでいるとき「ある条件と別の条件を同時に満たす場合のみ、ある処理を実行したい」ということがあります。これは、条件式と条件式の間にandを入れることで実現します。以下は、いたずらでマイナスの年齢が導入された場合に、それを注意するコードとなります。

age = -10

if age >= 20:
 print("20歳以上です。")

elif age >= 0 and age < 20:
 print("20歳未満です。")

elif age < 0:
 print("年齢にマイナスを入れてはいけません。")

6行目に、条件式が2つあり、andで結合されていることがわかります。このように書くと、「ageが0以上、かつ、20未満ならば」という条件判定を行うことが可能です。なお、

  • 条件式A and 条件式B and 条件式C and …

のように、条件式はいくらでも並べることが可能です。この場合、すべての条件を満たす場合のみ、処理が実行されます。ちなみに上記のコードでは、elifを2つ使用しているのも新しいポイントです。elifは1つしか使えないわけではありません。

or による条件式の結合

続いて、「ある条件と別の条件のうち、どちらか片方を満たしている場合のみ、ある処理を実行したい」という場合について考えます。この場合は、条件式と条件式の間にorを入れることで実現できます。例えば、以下は、体重が軽すぎるか重すぎるかの際に警告を発するコードです。

weight = 120
if weight < 20 or weight > 100:
 print("体重が異常値です。")
 print("医師の検診をお勧めします。")

これは、体重が20kg未満か、100kg以上のときに医師の検診を進めています。このように条件式の間にorを挟むことで、どちらか一方を満たす場合に処理が実行されます。なお、20kgや100kgの閾値はデタラメに決めたものですから、真に受けないでください。

入れ子構造

これまでの説明により、if文により指定した条件を満たす場合、インデントされた領域が実行されることが理解できたと思います。ここでは、より深くif文を理解するために、さらに踏み込んだ内容を説明します。以下のコードを見てください。

s = "男"
weight = 100

if s == "男":
 if weight < 40 or weight > 100:
  print("体重が異常値です。")
  print("医師の検診をお勧めします。")
 else:
  print("体重は正常です。")

elif s == "女":
 if weight < 30 or weight > 90:
  print("体重が異常値です。")
  print("医師の検診をお勧めします。")
 else:
  print("体重は正常です。")

一般に、体重は女性よりも男性が重い傾向があります。このため、異常となる基準値を性別で変えているのがこのコードです。男性であれば体重が40未満か100より大きい場合、女性であれば体重が30未満か90より大きい場合に、それぞれ異常としています(先ほどと同様、この閾値はデタラメなものですから、真に受けないでください)。

ifやelifがたくさんあって大変ですが、11行目のelifと対応づいているのが4行目のif文です。したがって、4行目のif文でFalseとなった場合、11行目のelifがチェックされます。4行目がTrueの場合は5行目のif文が実行対象となります。5行目のif文は8行目のelse文と対応づいており、5行目でTrueになるかFalseになるかで実行される内容が変化します。大事なのは、6, 7, 9行目にインデントが2つある部分です。5行目のif文がすでに1つ分のインデントがありますので、Trueの場合の処理範囲を決めたい場合は、6, 7行目に2つ分のインデントが必要になるわけです。同様に、8行目のelseにはすでにインデントが一つありますので、9行目の処理を行う場合には2つ分のインデントが必要です。

このように、if文の中にif文があるような構造を入れ子と呼び、外側のif文を親、内側のif文を子と表現します。これについてまとめると、以下のようになります。

  • if文は入れ子構造が可能
  • 親のif文の処理範囲は、1つインデントされた部分
  • 子のif文の処理範囲は、2つインデントされた部分
  • if-elif-elseの対応関係は、同じ数だけインデントされた部分

少し難しいですが、自分で色々とコードを変化させ、出力を見てみると、if分の入れ子構造が理解できると思います。

以上でif文の解説を終わります。基本的な事項なので、ぜひマスターしましょう。