if文による条件分枝

if文による条件分枝

フロー制御

 一般的に、プログラムを実行すると、ソースコードを上から下へ順に読み込んで処理していきます。この流れのことをフローとよびます。しかし、それだけではプログラムは単純なことしかできません。その時々の条件によって流れを変える フロー制御 を用いることで複雑なプログラムを作ることができるのです。今回の記事で解説する if文、else文、elif文 も代表的なフロー制御です。
 

if文とelse文

 Python で「ある条件を満たす場合にはこれを処理しなさい」と命令したいときは if 文 を用います。if に条件文を添えて改行し、処理内容はインデントしたブロックの中に記述します。

 Python if文による条件分枝

 条件を満たさない場合は、ブロックの内容を無視して下に流れてゆくことになります。
 

英語クイズプログラム

 if文を使って簡単なクイズのコードを書いてみます。

# 英語クイズプログラム

x = input("重力を英訳すると?:")

if x == "gravity":
    print("正解です!")

 このコードを実行すると「重力を英訳すると?」という質問文付きのテキスト入力ボックスが現れます。ユーザーが「 gravity 」と入力すると「正解です!」というメッセージが表示されます。しかし、このコードでは間違った答えを入力したときに何も表示されません。それではあまりに無愛想なので、間違えたときには「残念! 正解は gravity です!」と表示するプログラムにしてみましょう。そういう場合に使うのが else文 です。

# 英語クイズプログラム

x = input("重力を英訳すると?:")

if x == "gravity":
    print("正解です!")
else:
    print("残念! 正解は gravity です!")

 else文 では if文の条件に適さなかった場合に実行させる処理を記述します。

 Python else文による条件分枝

 フローの視点で見ると、if 文の条件を満たさなかった場合は、その行を素通りして下に降り、else 文のブロックに書かれてあるコードを読み込んで実行します。そのあとで、if 文の条件を満たしたときに枝分かれしたフローと合流します。
 

偶奇判定プログラム

 else 文を用いた例をもう1つ紹介します。
 1 ~ 10 の乱数を発生させて、その数字が偶数か奇数かを判定するプログラムです。下のサンプルコードでは、numpy というモジュールから randint 関数を呼びだして乱数を生成しています。
 numpyモジュールが使えない環境にある場合には、代わりに from random import* と記述して、標準モジュールから同じ名前の randint 関数を呼びだしてください。

# 偶奇判定プログラム

# numpyモジュールから乱数を生成する関数を呼びだします
from numpy.random import *

# 1~10 の整数をランダムに生成します
x = randint(1, 11)

# x の値を表示します
print("x =",x)

# x を 2 で割った余りが 0 なら x は偶数です
if x % 2 == 0:
    print("x は偶数です")

# そうでない場合は x は奇数です
else:
    print("x は奇数です")
x = 7
x は奇数です

 このコードを実行すると、生成された乱数 x の値が表示され、その数字が偶数であれば「偶数です」、奇数であれば「奇数です」と表示されます。
 

elif文

複数の条件を重ねます

「条件 X を満たす場合は A を実行し、X を満たさなくても条件 Y を満たす場合は B を実行し ...... 」というように複数の条件を重ねて処理したい場合elif 文 を用います。

 Python elif文による条件分枝

 if 文の条件を満たさなかった場合は elif 文に降りて、そこで次の条件に合致するかどうかを判断します。条件を満たせば処理 B を実行したあとで処理 C へ移ります。
 

大気圏のプログラム

 ユーザーが入力した高度 (km) に応じて、対流圏、成層圏、中間圏、熱圏、大気圏外のいずれかを返すプログラムです。

# 大気圏と高度の対応プログラム

# ユーザーに高度の入力を促します
x = input("高度 (km) を入力してください:")

# 文字列を float に変換します
x = float(x)

if x < 12:
    print("対流圏 (Troposphere) です")

elif 12 <= x < 50:
    print("成層圏 (Stratsphere) です")

elif 50 <= x < 80:
    print("中間圏 (Mesosphere) です")

elif 80 <= x < 800:
    print("熱圏 (Thermosphere) です")
    
else:
    print("大気圏外 (outer space) です")
高度を入力してください:45
成層圏 (Stratsphere)です

[補足] 対流圏は緯度によって境界線が大きく異なり、9 ~ 17 km の幅があります。熱圏の外側にさらに外気圏 (Exosphere) をおく場合もあります。ちなみに NASA は高度 100km の「カーマン・ライン」とよばれる境界線の向こう側を「宇宙空間」と定義しています。