23: プログラミングの要である「条件分岐」を身につける

前回の続きです。

if文の概要

条件分岐はプログラミングの要です。

条件分岐というのは、例えば年齢が18歳以上だったらお酒を販売できる、そうでなければ販売しないといった処理を行うときに使います。

age = 18
if age >= 18:
    print("お酒を販売できます")
else:
    print("お酒を販売できません")

もう少し抽象的に言うと、〇〇だったら〇〇する、□□だったら何をする、どれにも合致しなければこれをするというように、条件によって処理を振り分けたいとき、電車のレールを切り替えるかのように、プログラムの行き先も切り替えます。

このときに、ifを使います。

ifというのは論理型のところでやりましたが、真偽値と組み合わせて使います。

つまり、TrueかFalseになるものと組み合わせて使うということです。

上の画像ではage >=18となっていますが、Trueとなります。if文の判定の結果、このプログラムではprint(“お酒を販売できます。”)の部分が実行されます。

if 条件1:
    # 条件1が真の場合の処理
elif 条件2:
    # 条件2が真の場合の処理
else:
    pass
    # どの条件にも合致しなかったときの処理

if文の文法です。

上の図のようにifと書いて、この緑色の条件1となっているところに条件を書きます。

先程の例でいくと、age >=18 のような条件です。条件の後は :(コロン) を書き、インデント(字下げ)して合致したときの処理を記述します。

2つ目の条件がある場合は elif と書いて条件を書き、:(コロン)を下記、インデントして合致したときの処理を記述します。

そして、どの条件にも合致しないときの処理がある場合、elseと条件を書き、コロン、インデント、処理を記述します。

Pythonでは条件に合致した場合の処理でや、繰り返し構造を表すとき、このインデントを使います。

インデントを行う場合は、キーボードのTabキーを押します。

if文条件分岐というのはプログラミングの要で、条件分岐がないプログラムというのは、カルピスが入っていないカルピスウォーターみたいなもので、味気ないです。

そんなに役に立つものにはなりません。

大体分かったところで、実際に書いていきましょう。

if文実践 (お寿司屋さんで何が食べられるか判定するプログラム)

ではif文を書いていきましょう。

お財布に入っている金額によってお寿司屋さんに行った時に何が食べられるか判定する、というプログラムを作ってみたいと思います。

では、お財布に入っている金額、これを変数moneyとして、とりあえず1,000円入っていることにします。

money = 1000

そしてmoneyが1,000円入っていたらマグロを食べるということにしたいと思います。

条件に合致したときは”マグロを食べます。”と表示します。

money = 1000

if money >= 1000:
    print("マグロを食べます。")

これで実行してみます。

そうすると現在の所持金は1,000円ですから条件に合致しますね。

ですから、プログラムの実行結果は”マグロを食べます。”と表示されます。

if money >= 1000:、この部分でTrue, Falseの評価がされます。この場合はTrueとなりますので、print関数が実行されます。

では、moneyを100円にしてもう一度やってみましょう。

money = 100

money >= 1000:の条件に合致しないので実行結果に何も表示されません。

条件に合致しない時は、特に何も指定していませんので、ターミナルには何も表示されないということになります。

つまり、最初の条件に合致しなかったときに何もしないのであればelif、elseのどちらも不要というわけです。

次は複数条件があった場合、処理を分けることをやります。

ではmoneyが800円以上あればエビを食べるということにしたいと思います。

money = 800

if money >= 1000:
    print("マグロを食べます。")
elif money >= 800:
    print("海老を食べます。")

“海老を食べます。”と表示されます。

初めに、money >= 1000:の条件に合致するかチェックします。

合致しないので、次のコードに進みます。

次の条件、money >= 800:の条件には合致しますので、”海老を食べます。”が実行結果として表示されます。

次はどの条件にも合致しなかった時の処理を書いています。

else:と書いて、どの条件にも合致しなかった時は、”食べられるものがありません。”と表示させます。

では、所持金を100円にしてやってみます。

money = 100

if money >= 1000:
    print("マグロを食べます。")
elif money >= 800:
    print("海老を食べます。")
else:
    print("食べられるものがありません。")

money >= 800に合致しませんので次に進みます。

elseはどの条件にも合致しない場合、プログラム部分が実行されるので、”食べられるものがありません。”と表示されます。

次はさらに条件を重ねていきたいと思います。

500円以上持っていた場合は”サンマを食べます。”と表示されるようにしてみたいと思います。

では所持金を600円にしてみます。

money = 600

if money >= 1000:
    print("マグロを食べます。")
elif money >= 800:
    print("海老を食べます。")
elif money >= 500:
    print("サンマを食べます。")
else:
    print("食べられるものがありません。")

money >= 1000:にも合致しません。money >= 800:にも合致しません。

moneyは600円ですから、money >= 500:に合致しますので、”サンマを食べます。”と表示されます。

次に、elseと書いてありますが、この行には進みません。

どれかの条件に合致した場合は、実行されるのは最初の一回だけです。

ただし、これには少し注意が必要です。どれかに合致した場合、条件判定全体が終了してしまいますので、複数条件を書く場合、厳しい条件から書くようにしないとうまくいきません。

例えば簡単な条件から書いて合致した場合、続く判定は行われませんので、処理漏れ、処理間違いが起きる可能性があります。

例として最初の条件を所持金が100円だったらとし、合致したら”かっぱ巻きを食べます。”と表示することにしたいと思います。

money = 600

if money > 100:
    print("カッパ巻きを食べます。")
elif money >= 1000:
    print("マグロを食べます。")
elif money >= 800:
    print("海老を食べます。")
elif money >= 500:
    print("サンマを食べます。")
else:
    print("食べられるものがありません。")

今、所持金は600円です。

まず最初のこの条件、100円あればカッパ巻きを食べるという判定になります。合致していますので、カッパ巻きを食べますと表示されます。

本来であれば、所持金が500円以上だったら、サンマを食べますと表示されるわけですが、if文は上から順に処理されるので、最初の条件、money >= 100:に合致して”カッパ巻きを食べます。”と表示されて、プログラムは終了してしまいます。

このように、簡単な条件から書いて合致した場合、続く判定は行われないということに注意する必要があります。

複数条件を書く場合は、以下のように厳しい条件から順番に書くようにします。

money = 600

if money >= 1000:
    print("マグロを食べます。")
elif money >= 800:
    print("海老を食べます。")
elif money >= 500:
    print("サンマを食べます。")
elif money > 100:
    print("カッパ巻きを食べます。")
else:
    print("食べられるものがありません。")

ぜひ、あなたご自身でも条件を色々追加して試してみてください。

データが空っぽかどうかで if文の条件判定を行う

if文についてもう少し掘り下げてみたいと思います。

条件を評価するとき、データが空かどうか? も判定に使えます、という話をします。

データが空かどうかというのは数値、文字列、リスト、Noneの時にFalseになる、というものです。

数値が0または0.0だったらFalse、文字列の時、””のように空文字だったらFalse、リストの時に[]だったらFalse、辞書の時に{}だったらFalse、Noneの時はFalse、数値の場合0とか0.0でだったらFalse、空文字だったらFalse、空のリストだったらFalseというものです。

それ以外はTrueとして評価されるという話を以前しましたが、これを条件判定に使ってみます。

moji = ""

if moji:
    print("文字がはいっています")
else:
    print("文字がはいっていません")

実行しますと、”文字が入っていません”と返ってきます。mojiは空文字ですからFalseになります。

ではmojiにPythonと入力して実行してみます。

moji = "Python"

if moji:
    print("文字がはいっています")
else:
    print("文字がはいっていません")

そうすると”文字が入っています”と返ってきます。

Pythonではこのようにデータがからかどうか? で判定文を書くことができます。

「空ではなかったら」、という判定をしたい場合どうすればいいでしょうか? 以下のように != 演算子を使います。

moji = "Python"

if moji != "":
    print("文字がはいっています")
else:
    print("文字がはいっていません")

この != は、そうでなかったらという意味です。

この場合は空文字ではなかったらという意味になります。実行結果は、”文字がはいっています”になります。

もっとも、Pythonでこのような記述は冗長かもしれません。なぜならデータが空かどうかで判定できるからです。

次はリスト型でやってみましょう。

lst = []

if lst:
    print("list is not empty")
else:
    print("list is empty")

これを実行するとリストは空ですから、”list is empty”と表示されます。

ではリストの中身に何か書いてみます。

lst = [1, 2, 3, 4, 5]

if lst:
    print("list is not empty")
else:
    print("list is empty")

するとリストの中身がありますので、”list is not empty”と表示されます。

このデータが空かどうか? という判定方法、しばしば使うことがありますので覚えておきましょう。

and演算子、or演算子を使って複雑な条件を判定する

次は論理演算子を使って複数条件の判定をやってみます。論理演算子というのはorとかandを使用するものでした。

野球が好き、もしくはサッカーが好き、あるいは両方好きであれば合致するみたいなときに使うものです。

以下のコードで確認します。

like_baseball = True
like_football = False

if like_baseball and like_football:
    print("両方好きです")
elif like_baseball or like_football:
    print("どちらかが好きです")
else:
    print("どちらも好きではありません")

もし両方(and)好きだったらつまり、両方Trueだったら”両方好きです”と表示され、どちらか一方だけ(or)がTrueだったら”どちらかが好きです”と表示されます。

そしてどちらも好きではなかったら、”どちらも好きではありません”と出力します。

上記コードを実行するとどうなるでしょうか。

ちょっと考えてみましょう。

答えは、”どちらかが好きです”と表示されます。

andを使った場合、両方好きじゃないといけませんので条件には合致しません。

そしてorの場合はどっちかがTrueであればいいということですから、どちらか好きだと表示されます。

ではどちらもFalseにしてみます。

like_baseball = False
like_football = False

するとこの上2つの条件に合致しませんので、elseの”どちらも好きではありません”というところに進んでいきます。

このようにandやorを使って複雑な条件判定ができます。このand orはよく使いますので覚えておきましょう。

ぜひ、あなたご自身でもこういうお題を考えてif文を書いてみましょう。

何か現実の世界でif文を書けるものがないかどうか考え、実際に書いてみるというのもプログラミングの習得には非常に有効な手法だと思います。

今後、業務の中で、こういう場合はこういう処理をするという条件判定を必ず行うようになると思います。

そんな時にどうやって現実世界の条件判定をプログラムに落とし込むか? という練習になりますので、何か身近なものでお題を考えて、if文にして書いてみましょう。

if文の中にif文を書いて判定する方法と注意点

次はif文のネスト(入れ子構造)を見てみます。

if文は入れ子構造にできますが、入れ子構造になっている場合、それぞれのifブロックで条件判定が行われて合致した場合、あるいは合致しなかった場合の処理が行われます。

以下のように、どっちかがTrue、という場合に、野球とフットボールのどちらが好きか? を表示してみたいと思います。

like_baseball = True
like_football = False

if like_baseball and like_football:
    print("両方好きです")
elif like_baseball or like_football:
    print("どちらかが好きです")
    if like_baseball:
        print("野球が好きです")
    else:
        print("サッカーが好きです")
else:
    print("どちらも好きではありません")

like_baseballをTrueにして、like_footballをFalseにします。これで実行するとどうなるでしょうか?

“どちらかが好きです”と”野球が好きです”と表示されます。

次は、野球とフットボールの好き嫌いを入れ替えてみましょう。

like_baseball = False
like_football = True

if like_baseball and like_football:
    print("両方好きです")
elif like_baseball or like_football:
    print("どちらかが好きです")
    if like_baseball:
        print("野球が好きです")
    else:
        print("サッカーが好きです")
else:
    print("どちらも好きではありません")

すると”どちらかが好きです”と表示され、次は野球が好きか? という判定が行われます。

野球はFalseですから、条件に合致しなかったときの処理に入り、”サッカーが好きです”と表示されます。

このようにif文の中にさらにif文を書くことができます。

このif文の入れ子構造、ネストはいくらでも入れ子構造にできます。

例えばこのif分の中にさらに条件き、その条件の中にさらに条件を書き、さらに、、、と言うようにいくらでもネストすることができます。

しかし、何段階にもネストされているとコードが非常に読みにくくなり、バグの温床になります。

バグというのはプログラムが意図した結果にならない、というやつですね。

ですから、if文がいくらでもネストできるといっても、どんなに多くてもせいぜい3段階ぐらいのネストにしておきましょう。

if文まとめ

ここまで条件分岐if文についてみてきました。条件分岐というのはプログラミングの要です。

これをうまく書けるかどうかというのが使いやすいプログラムになるかどうかというポイントになります。

条件分岐するときは真偽値がTrueかFalseになるようなものと組み合わせて使います。

例えば年齢が18歳以上だったらお酒を販売できる、そうじゃなければ販売しないと言うようなときは、このifで条件文を書いてコロン、そしてインデントして合致したときの処理、そして条件に合致しなかったときはelseとコロンで合致しなかったときの処理と書きます。

age = 18
if age >= 18:
    print ("お酒を販売できます。")
else:
    print ("お酒は販売できません。")

さらに条件がある場合は、elifと書いて、さらに条件があればelifというふうに書いてきます。

もし最初の条件に合致したときだけ処理をする、といった場合は無理矢理 elif や else は書かなくても大丈夫です。

if 条件1:
    # 条件1が真の場合の処理
elif 条件2:
    # 条件2が真の場合の処理
else:
    pass
    # どの条件にも合致しなかったときの処理

条件に合致した後の処理ですが、どれか合致した場合は、その後に続く条件があっても、そのifブロックは全体としては終了してしまいます。

ですから、複数条件を書く場合、厳しい条件から書いていくようにします。そうしないと意図した通り動かない可能性が非常に高いです。

そして、if文はネスト(入れ子構造)できます。

a = 10
b = 5

if a > b:
    print("a は b より大きいです")

    if a > 15:
        print("a は 15 より大きいです")
    elif a > 12:
        print("a は 12 より大きく、15以下です")
    elif a > 5:
        print("a は 5 より大きく、12以下です")
    else:
        print("a は 5以下です")

入れ子構造にする場合、このように書くと、if文の中にさらにif文を書きます。

ただし、このネスト、あまりやりすぎると訳がわからなくなりますので、せいぜい3段階までにしておきましょう。

条件分岐はプログラミングの要ですから、ぜひあなたもご自身で身の回りにあるものをテーマにif文としてなにか表現して練習をしてみてください。プログラミングが上達していきます。

将来何か業務で使うアプリを作ったときに、業務のこういう条件のときはこうするというように、プログラムに落とし込むときに役に立つはずです。

ぜひ、身の回りのものをテーマにif文の練習をしてみましょう。