boolとNone
「まだ払っていない」と「まだ入力していない」は別物
おこづかい帳に「もう払ったかどうか」を持たせたいとします。値は 2 つです。払った、まだ払っていない。この 2 択のために Python が用意しているのが bool という型で、True と False の 2 つの値だけを取ります。
ところが実際には 3 つ目の状態があります。そもそもまだ入力されていない、という状態です。払ったとも払っていないとも言えません。ここで False を代用してしまうと、あとで「未入力」と「未払い」の区別が付かなくなります。この空っぽを表すのが None です。
Python
paid = True
print(type(paid).__name__)
print(type(None).__name__)bool と NoneType と出ます。None は 0 でも空文字でもなく、「何も入っていない」という状態そのものを表す値です。return を書かない関数が返すのも、この None です。
先頭は大文字
True False None の 3 つとも、先頭が大文字です。true や none と小文字で書くと NameError になります。他の言語から来た人がいちばん引っかかるところです。
クオートで囲んだ "True" は、見た目こそ同じですが str です。まったくの別物なので混ぜないでください。
0 と False も型が違います。0 は int で、金額の 0 は「0 円使った」という立派な数値です。「いいえ」ではありません。この区別を崩すと、0 円の記録が消えるようなバグにつながります。
空っぽを表す値は
0""NoneFalseと 4 つあります。どれを使うかは意味で決めます。金額なら0、品名なら""、未入力ならNone、判定結果ならFalseです。
文字にすると、見たままになる
str はどんな値でも文字列にできるので、True も None も例外ではありません。
Python
print(str(False))
print(str(None))False None と、そのままの見た目で表示されます。この性質のおかげで、bool や None を含んだメッセージも + の連結だけで組み立てられます。
やってみよう
関数 payment_status を実装してください。引数 paid を 1 つ受け取り、その値と型名を並べた文字列を返します。
形は 支払 のあとに値、型 のあとに型名です。payment_status(True) なら 支払 True 型 bool、payment_status(None) なら 支払 None 型 NoneType になります。半角スペースの位置は変えないでください。
値の文字列も型名も、どちらもここまでの回で出てきた道具で取り出せます。0 や "True" を渡すと型名だけが変わることも、テストで確かめてみてください。
要件
- 関数名は payment_status で、引数は paid の1つ
- 値の部分は str(paid) で文字列にする
- 型名の部分は type(paid).name で取り出す
- "支払 " と " 型 " の半角スペースの位置を変えない