Developer

【Python独学】if文のネスト構造
2020.11.02
Lv1

【Python独学】if文のネスト構造

if文のネスト構造について

今回は、if文を用いた「ネスト構造」について扱っていきます。
if文の条件分岐処理の中で更に条件分岐を行う際、「ネスト構造」と呼ばれる書き方をすることが出来ます。
「ネスト構造」については、こちらの記事でも紹介しています。


前回の記事では、if文の基本的な構文について紹介しました。

x = 5
if x < 10:
    print("xの値は10未満です")          ###インデントする
C:\Python> python 3-2.py
xの値は10未満です

前回ちらっと書きましたが、if文の処理内に更にif文を記述することが出来ます。
例を見てみましょう。

x = 20
if x >= 10:
    if x < 30:                               
        print("x = " + str(x))               
        print("xの値は10以上30未満です")
C:\Python> python 3-2.py
x = 20
xの値は10以上30未満です

上記の例の場合、
・1つ目のif文→xが10以上なのでTrue
・2つ目のif文→xが30未満なのでTrue
・2つ目がTrueなのでprint文が実行されている
といった処理になっています。

このように、if文の処理内に更にif文を書くような構造を「ネスト構造」と呼ぶことがあります。
それでは、ネスト構造を用いたif文の具体例を見てみましょう。


ネスト構造を用いたif文の具体例

複数の条件に応じて、処理内容を変えていく記述を見てみましょう。
今回は買い物を例に見てみましょう。

パイソンくんはお母さんに頼まれて買い物に行くことになりました。
お母さんからは以下のように買い物をするように言われています。
「牛肉が1000円以下だったら牛肉を買ってきてちょうだい。
もし牛肉が1000円以上だったら、豚肉を買ってきてほしいわ。
豚肉が500円以上だったら、鶏肉を買ってきて!」

実際の記述に入る前に、条件を整理してみましょう。

1. 牛肉が1000円未満 → 牛肉を購入
牛肉が1000円以上 → 次の条件分岐へ
2. 牛肉が1000円以上かつ豚肉が500円未満 → 豚肉を購入
牛肉が1000円以上かつ豚肉が500円以上 → 次の条件分岐へ
3. 牛肉が1000円以上かつ豚肉が500円以上 → 鶏肉を購入

さて、2つの条件と3つの結果が並びました。
それぞれの条件をそのままif文として記述した場合は以下のようになります。

1つ目の条件

if beaf >= 1000:
	次の条件分岐へ
else:
	牛肉を購入

2つ目の条件

if pork >= 500:
	鶏肉を購入
else:
	豚肉を購入

それでは、以上の条件をまとめて1度に記述してみましょう。

beef = 1100				###牛・豚・鶏の値段を設定
pork = 550
chiken = 300
if beef >= 1000:			###牛が1000円以上だったら次の条件分岐へ
	if pork >= 500:			###豚が500円以上だったら次の条件分岐へ
		print("鶏肉を買ってきました。" + "\n" + "鶏肉は" + str(chiken) + "円でした。")
	else:
		print("豚肉を買ってきました。" + "\n" + "豚肉は" + str(pork) + "円でした。")	
else:
	print("牛肉を買ってきました。" + "\n" + "牛肉は" + str(beef) + "円でした。")
C:\Python> python 3-2.py
鶏肉を買ってきました。
鶏肉は300円でした。

1度目の条件分岐がTrueだった場合の処理の中に、次の条件分岐を表すif文を記述しています。
このように、処理文の中に更に条件分岐などを記述していくことを
「ネスト構造」と呼ぶことがあります。

上記のような書き方をする場合、Pythonではインデントの数でプログラムのブロックを規定しているため、
インデントの数がずれただけでエラーを起こし、プログラム全体が正常に実行されなくなってしまいます。
ネスト構造に限った話ではありませんが、インデントの数に気をつけて記述しましょう。

また、ネスト構造は上手に使えば便利なケースもありますが、多用するとプログラム自体が非常に見ずらいものになってしまいます。

if a = 1:
    if b = 5:
        if c = 10:
            if d = 20:
                …………
                …………

このように、ネストが続けば続くほど、どの行にどの処理が書かれているのか、どの条件分岐の結果どの処理が実行されるのか
非常にわかりづらくなってしまいます。
明確な決まりはありませんが、あまりネストが重なるようなら、条件を見直すなど何らかの対処が必要です。


論理演算子を使った条件の簡略化

上で示したように、ネストを複雑化させてしまわないようにする手段の1つとして、
if文の条件式にこちらの記事で紹介した、論理演算子を用いる方法があります。

例えば、以下のような例を見てみましょう。

この試験では、
・英語と数学がそれぞれ70点以上
・両方の合計が150点以上
なら合格、それ以外は不合格となる。

上記のような条件の場合、論理演算子のandを用いることで、if文をネスト構造にせずに記述することが出来ます。
論理演算子のandは、2つの条件の両方がTrueのときTrueを返す演算子です。
まずは、ネスト構造を用いた記述を見てみましょう。

english = 80
math = 75
total = english + math
if english >= 70:
	if math >= 70:
		if total >= 150:
			print("合格だ!")
		else:
			print("不合格だ…")
	else:
		print("不合格だ…")
else:
	print("不合格だ…")

elseまで含めた全体を考えると、お世辞にもわかりやすいプログラムとは言えない状態になっているのがわかると思います。
今度は、これらの条件をandでまとめて1つの条件式にして、記述してみましょう。

english = 80
math = 75
total = english + math
if english >= 70 and math >= 70 and total >= 150:
	print("合格だ!")
else:
	print("不合格だ…")
C:\Python> python 3-2.py
合格だ!

このように、複数の条件を扱う場合は、条件によってはif文のネストではなく論理演算子を用いることで
条件を簡略に記述することもできます。


まとめ

・if文の条件の中では、更にif文を記述することができます。これを、「ネスト構造」と呼びます。
・ネスト構造は使い方によってはプログラムを複雑にしてしまうため、条件をよく見定めて使いましょう。


確認問題

1.以下の条件をif文を使って記述してみましょう。
「あなたはPS5の抽選に参加しました。
抽選に当選、かつお金を50000円以上持っている場合購入することができます。」
抽選結果:result = True もしくは False
所持金 :money

連載目次

独学で学ぶ Pythonプログラミング 連載目次