デフォルト値とor
未入力のまま保存されると、あとの集計が狂う
おこづかい帳に記録を足すとき、カテゴリの入力を面倒がって空のまま進めてしまうことがあります。空のまま保存すると、集計するときに行き場のない記録が残ります。
そこで「入力されていなければ既定値で埋める」という穴埋めをします。未入力を表す値は 2 通りあり、どちらも受け止められるようにします。空文字 "" は何も打たずに確定したとき、None はそもそも値が渡されなかったときです。
Python
memo = None
if memo is None:
print("メモなし")None かどうかの判定に == ではなく is を使っている点に注目してください。None は世界に 1 つしかない特別な値なので、「同じ値か」ではなく「そのものか」を見る is で比べるのが Python の作法です。memo == None でも動きますが、エディタは is None を勧めてきます。
空っぽの値は False として扱われる
Python では、if の条件に True や False 以外の値をそのまま書けます。そのとき 空っぽのもの は False として扱われます。偽になるのは False と None と 0、空文字 ""、それに空のリストや辞書です。残りはすべて真です。
つまり if memo: と書けば「memo に中身があるなら」という意味になります。None も "" も 1 つの条件でまとめて捕まえられるので、判定を 2 本並べる必要がありません。
or を使うと、判定と値の選択を 1 つの式にできます。
Python
name = ""
label = name or "名無し"
print(label)名無し が出ます。or は「左が真ならその左の値を、そうでなければ右の値を返す」働きをします。True や False そのものではなく、元の値のほう が返るのがポイントです。"たろう" or "名無し" は "たろう" になります。既定値の指定として実務でもよく見かける書き方です。
0 円が既定値に化ける
この穴埋めは短くて強力ですが、0 も偽として扱われる点だけ注意します。
Python
price = 0
print(price or 100)100 が出ます。0 円という正しい入力が、勝手に 100 に置き換わってしまいました。金額のように 0 が意味を持つ値では or を使わず、if price is None: と明示的に書きます。
文字列でも同じで、"" を「意味のある空」として扱いたい場面では使えません。何を未入力と見なすかを先に決めてから、道具を選びます。
やってみよう
関数 fill_category(category) を実装してください。category が空文字 "" か None のときは "その他" を返し、それ以外はそのまま category を返します。
if でも or でもどちらでも構いませんが、まず if で書いてから短く縮めてみると、or の働きが体で分かります。
要件
- 関数名は fill_category で、引数は category の 1 つ
- category が空文字 "" のときは "その他" を return する
- category が None のときも "その他" を return する
- それ以外のときは category をそのまま return する
入出力例
fill_category("食費") → "食費"
fill_category("娯楽") → "娯楽"
fill_category("") → "その他"
fill_category(null) → "その他"
fill_category("その他") → "その他"
fill_category("医療費") → "医療費"