プログラムの流れを制御する方法は3種類しかありません。「順次(上から下へ)」「分岐(条件による選択)」「反復(繰り返し)」です。
今回はその中で「分岐」を担当するif文の基礎と条件式についてお話します。
if文の書き方
まずは簡単なif文を書いてみましょう。
x = 5
if x == 5:
print(x)
#実行結果 5
if文の始めは「if 条件式:」です。最後のコロンも必須になっています。
このコードの中で「x == 5」の部分がif文の条件式と呼ばれる部分になります。考えられる条件式は無限にありますが、ルールはごくシンプルです。それは式の最終結果が「真(True)」か「偽(False)」かのどちらかにしかならないということです。
例では「xが5と等しい」という条件式によって、処理が分岐します。この条件式の結果が「True」の場合、処理は次の行へ移りますが、「False」の場合は何も起こりません。
最後の行はif文の処理内容です。Pythonでは処理内容を括弧で囲ったりせず、その代わりにインデント(Tabキーで入力できます)を用いて、条件を記述する部分と処理内容とを区別しています。もしインデントが無ければ、
x = 5
if x == 5:
print(x) #IndentationError: expected an indented block
このようなエラーになります。忘れないようにしましょう。
elseとelif
上のコードでは「xが5と等しい」場合にしか処理が実行されません。そこでもう1つ「そうでなければ」を表す文を付け加えましょう。
x = 3
if x == 5:
print(x)
else:
print("5以外")
#実行結果 5以外
「else:」の後の行に、if文と同じようにインデントで字下げして処理内容を記述します。このようにすると、ifの条件式の結果がfalseであった場合、else文の処理内容が実行されます。
else文は「それ以外全て」を表すので、条件式は不要です。インデントはif文と揃えなければならないことには注意してください。
さらにもう1つ、「そうでなくて〇〇なら」を加えてみます。
x = 3.29
if x == 5:
print(x)
elif x < 5:
print("5より小さい")
else:
print("5より大きい")
#実行結果 #5より小さい
ifとelseに挟まれた「elif 条件式:」がその文です。Pythonではelse ifを略したelifで「そうでなくて〇〇なら」を表します。
やっていることはif文と同じなので条件式が必要です。またelifはifやelseとは違い、いくつでも重ねることができます。
「そうでなくて〇〇なら」を表すのがelif
フローチャートで流れを視覚化する
ifなどの制御構文を記述するときは、そのデータがどのような流れで処理されるのかを意識することが大切です。流れを把握できないまま記述してしまうと、「else文はどんな場合でも一生実行されることがない」など、欠陥のあるコードになってしまうことも多々あります。
流れを把握するためによく使われるのがフローチャートです。フローチャートについての詳細はここでは解説しませんが、流れが複雑になってしまうような場合には一度書いてみることをお勧めします。
一例として、上のif文のコードはこんなフローチャートになります。
フローチャートは例のように図形の形によって、そこに何が記されているかが分かるようになっています。フローチャートは企業のプロジェクトなどでもよく使用されていますが、基本的な記述方法は変わらないので、知っておくと役立つこともあるのではないでしょうか。
ここではプログラミングの制御構文で使用する、ごくごく基本的な図形だけご紹介しておきます。
式に見えない条件式
制御構文のキモは条件式です。この条件式の結果はTrueかFalseしか無いことはお話しましたが、この2つの値は「はい/いいえ」や「合っている/間違っている」が全てではありません。そのように解釈してしまうと、例えば以下のコードは説明が付きません。
number = 1
if number:
print("OK")
else:
print("NG")
#実行結果 OK
変数numberは他の何とも比較されていないため、「合っている/間違っている」という答えが出せません。しかし答えは「True」です。
もう1つ例を見てみましょう。
if print("Hello"):
print("OK")
else:
print("NG")
#Hello
#NG
関数も条件式として成立するので、エラーにはなりません。括弧を付けて呼び出しているためにprint関数は1行目で実行されて「Hello」が表示されますが、答えとしては「False」です。
この関数には戻り値がありません。戻り値が無いということは、関数呼び出しの結果は「None」になります。このNoneはれっきとした値ですが、PythonにはFalseと判定されます。
・値によってTrueになるものとFalseになるものがある
Trueを返す値、Falseを返す値
ではどういったものがTrueと評価され、Falseと評価されるのかを見ていきましょう。その値がTrueなのかFalseなのかは、値をbool値に変換する組み込み関数「bool」で調べることができます。
print(bool("Hello")) #True
print(bool("")) #False
print(bool(-1)) #True
print(bool(0)) #False
print(bool([1,2,3])) #True
print(bool([])) #False
通常の文字列や数値はTrueです。しかし「""」(空文字列)や「0」、空のリストなどはFalseと評価されます。
ややこしそうですが値単体でFalseと判定されるものは多くありませんので、ここでチェックしておきましょう。
Falseと評価される値 | 補足 |
---|---|
False | |
None | 関数からの戻り値が無い、あるいはNoneの場合など |
"" | 空文字列 |
0 | 数値の0。0.0や複素数の0jも含む |
[] | 空のリスト |
{} | 空の辞書 |
set() | 空のセット |
() | 空のタプル |
range(0) | 範囲が0のrange型 |
多くの型はその中身が空である場合、Falseと判定されます。これを利用して、例えばリストの中身が空であった場合のみ、要素を追加するなどのコードを簡潔に書くこともできます。
x = []
if x:
pass
else:
x.append(1)
print(x) #[1]