【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文の条件に適さなかった場合に実行させる処理を記述します。
フローの視点で見ると、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 文 を用います。
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 の「カーマン・ライン」とよばれる境界線の向こう側を「宇宙空間」と定義しています。
コメント