『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

条件分枝(if文・else文・elif文)

【Python】if文によるフロー制御

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

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

if 条件:
    条件が真の場合の処理内容

条件を満たさない場合は、ブロックの内容を無視して下に流れてゆくことになります。
if文を使って簡単なクイズのコードを書いてみます。

# PYTHON_IF

# In[1]

# 英語クイズプログラム

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

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

コード In[1] を実行すると「重力を英訳すると?」という質問文付きのテキスト入力ボックスが現れます。ユーザーが「gravity」と入力すると「正解です!」というメッセージが表示されます。

else文で条件が偽の場合の処理を実行する

コードでは間違った答えを入力したときに何も表示されません。それではあまりに無愛想なので、間違えたときには「残念! 正解は gravity です!」と表示するプログラムにしてみましょう。そういう場合に使うのが else文 です。

# In[2]

# 英語クイズプログラム

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 関数を呼びだしてください。

# In[3]

# 偶奇判定プログラム

# 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 は奇数です")

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

elif文で複数条件を処理する

「条件 X を満たす場合は A を実行し、X を満たさなくても条件 Y を満たす場合は B を実行し … 」というように複数の条件を重ねて処理したい場合は elif 文 を用います。
 
Python elif文による条件分枝
if 文の条件を満たさなかった場合は elif 文に降りて、そこで次の条件に合致するかどうかを判断します。条件を満たせば処理 B を実行したあとで処理 C へ移ります。
 
以下はユーザーが入力した高度 (km) に応じて、対流圏、成層圏、中間圏、熱圏、大気圏外のいずれかを返すプログラムです。

# In[4]

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

# ユーザーに高度の入力を促す
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) です")

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

コメント