条件の組み合わせ
材料が 2 つになると、1 本の条件では足りない
ここまでの分岐は、見ていた材料が 1 つだけでした。ところが実際には「土日で、しかも 3000 円以上」のように、2 つの条件が同時に成り立つかを見たい場面が出てきます。
書き方は 2 通りあります。if の中にもう 1 つ if を入れる ネスト と、and で 1 つの条件にまとめるやり方です。
Python
mark = "確認不要"
if category == "娯楽":
if price >= 5000:
mark = "要確認"
else:
mark = "記録のみ"
print(mark)外側で分野を、内側で金額を見ています。内側に入るのは外側が True だったときだけです。インデントは外側の if の中身で 4 つ分、内側の if の中身でさらに 4 つ分と、1 段ずつ深くなります。
同じ条件を 2 回書きそうになったら、ネストにする
同じことを and で平らにも書けます。
Python
mark = "確認不要"
if category == "娯楽" and price >= 5000:
mark = "要確認"
elif category == "娯楽":
mark = "記録のみ"通る道はまったく同じで、結果も 1 文字も変わりません。違うのは category == "娯楽" を 2 回書いている点です。
目安は下記のとおりです。外側の条件の中で処理が複数に分かれるならネスト、そろったときの処理が 1 つだけなら and が素直です。迷ったら「同じ条件を 2 回書いていないか」を見ます。書いていたら、ネストのほうが構造をそのまま写せます。
判定そのものが長いときは、is_target = category == "娯楽" のように条件へ名前を付けて変数に入れる手もあります。この一手で読みやすさが変わります。
== は省略できない
2 つの候補のどちらかを見たいとき、category == "食費" or "娯楽" と書くのは間違いです。Python はこれを (category == "食費") or ("娯楽") と読みます。"娯楽" は空でない文字列なので常に True 扱いになり、どんな値を渡しても条件が成り立ってしまいます。
エラーが出ないので気づきにくく、「何を渡しても同じ答えになる」という形で表に出ます。or でつなぐのは値ではなく 条件そのもの です。左右それぞれに == を書きます。
やってみよう
関数 weekend_alert(day, price) を実装してください。day は "月" から "日" までの曜日 1 文字です。
day が "土" か "日" で、かつ price が 3000 以上なら "週末の使いすぎ" を返します。週末だが 3000 未満なら "週末の支出"、週末でなければ金額に関係なく "平日の支出" を返します。
ネストと and の両方で書いてみて、自分にはどちらが読みやすいか確かめてみてください。
要件
- 関数名は weekend_alert で、引数は day と price の 2 つ
- day が "土" または "日" かつ price が 3000 以上なら "週末の使いすぎ" を return する
- 週末だが price が 3000 未満なら "週末の支出" を return する
- day が "土" と "日" のどちらでもなければ、金額に関係なく "平日の支出" を return する