前の記事でPythonでのif文(条件文)の書き方について、まとめました。今回はその発展形である「if文の入れ子(ネスト)」について、まとめました。
前回の記事でifとelseを使って「明日の天候によって、行動を変える」という次のようなプログラムを作りました。
tomorrow = "雨"
if tomorrow == "晴れ":
print("買い物にいく")
else:
print("ランニングか家で映画")
【実行結果】
ランニングか家で映画これで、変数tomorrowが晴れの日の行動は出力されるようになりました。ただ、上記のコードだと晴れと「それ以外」の指定はできますが、曇りの日と雨の日に出力する結果を指定(条件分け)することができません。では、どうすればよいでしょうか。
方法としては、「if文の入れ子(ネスト)と呼ばれる方法」と「elif文」があります。本記事ではif文の入れ子(ネスト)について、取り上げます。

if-else文だけで記述可能?
ifとelseだけを用いて次のようなコードで実現可能でしょうか?答えは「No」です。次のような結果が出力されます。
tomorrow = "曇り"
if tomorrow == "晴れ":
print("買い物にいく")
if tomorrow == "曇り":
print("ランニングにいく")
if tomorrow == "雨":
print("映画をみる")
else:
print("雪だるまつく~ろ~♪")
【実行結果】
ランニングにいく
雪だるまつく~ろ~♪2行出力されてしまいました。elseが紐づいているif文(ブロック)が最後の
if tomorrow == ”雨”:
だけだったのが原因です。この為、変数tomorrowが曇りだった結果と変数tomorrowが雨以外の結果(elseの結果)が出力されてしまいました。if文の入れ子(ネスト)を用いて、これを回避してみましょう。
if文の入れ子(ネスト)の書き方(1階層)
入れ子(ネスト)って?となりそうですが、if文のブロックの中に更にif文を加えたものになります。実際に例を見てみましょう。
tomorrow = "曇り"
if tomorrow != "晴れ":
if tomorrow != "曇り":
print("ランニングにいく")
else:
print("映画をみる")
else:
print("買い物にいく")
【出力結果】
ランニングにいくこのようにif文のブロックの中に更にif文があるような事(上記例の2行目と3行目以降のような関係)をif文の入れ子(ネスト)といいます。このコードでifだけを用いて晴れの時、曇りの時と「それ以外」の日の条件を分ける事ができます。
コードだけでは分かりにくいですが、次のような流れ(アルゴリズム)をコーディングしたものになります。

これで、晴れの日、曇りの日、「それ以外」の日を条件分けする事ができました。ただ、このまま変数tomorrowに雪を代入すると、どうなるでしょう。
答えは映画をみるが出力されます。上記のコードでは晴れ、曇りは指定できていますが、それ以外の天候は「それ以外」で一つにまとめられているのが原因です。
if文の入れ子(ネスト)の書き方(2階層)
では、先程のコードにif文を更に追加して、雨と「それ以外」の日も出力結果を指定できるようにしましょう。
変更箇所は
| 変更前 | 変更後 |
| 「曇り」と同じか | 「曇り」と異なるか |
| print(“ランニングをする”)を実行する | if文を更に追加して、更に条件分岐する |
となります。実際のコードです。
tomorrow = "雨"
if tomorrow != "晴れ":
if tomorrow != "曇り":
if tomorrow == "雨":
print("映画をみる")
else:
print("雪だるまつく~ろ~♪")
else:
print("ランニングにいく")
else:
print("買い物にいく")
【実行結果】
映画をみるちょっと複雑になってきましたが、考え方は先程と同じで、各ifで条件が分かれて(条件分岐して)、Yes(真:True)かNo(偽:False)で条件が分かれる事になります。また、Yes(真:True)の時に更に深い階層へ潜って、そこでif文で更に条件分岐していくことになります。
上記コードの流れ(アルゴリズム)になります。

今回のコードで晴れ、曇り、雨、「それ以外」の日に場合分けする事ができました。しかし、今回のコードでも雪と雹(ひょう)などは同じ「雪だるまつく~ろ~♪」が出力されてしまいます。
更に場合分けをしようと思ったら、if文の入れ子(ネスト)の場合は、同じように更にif文の階層を追加する…という作業を行う必要があります。
最後に、if文の入れ子(ネスト)について思うところを…
ここまでif文の入れ子(ネスト)について書いてきました。書いてきましたが、最後に一言だけ…
あまり素人がどうこう言える立場でないのですが、入れ子はできれば避けた方がいいと思います。
理由はメンテナンスが大変になるケースが多いという事です。そのコードを書いた本人はよくわかっているのですが、他の人が変更しようとすると、難解な事が多いです。それにより、変更して思いもよらなかったバグが発生する可能性もあります。
今回、例に挙げさせて頂いたものは単純です。単純ですが、一目で全て理解するのは手間がかかりませんでしたでしょうか??その為、同じように場合分けができるelif文を使うことをオススメします。可読性があがり、ご自身でメンテナンスをする時も、他の人がメンテナンスする時も過去の記憶を引っ張り出さなくて済むと思います。
elif文については下記記事をご参照ください。


コメント