= と == の書き間違い
total = budget は代入なので、比較のつもりで書くとエラーか、意図しない上書きになります。くらべるときは必ずイコール 2 つです。
レッスンの本文で注意している点を、つまずきの側から42件ぶん並べ直しました。書いた覚えのある形が見つかったら、 そのままレッスンに戻って前後を読めます。
= と == の書き間違いtotal = budget は代入なので、比較のつもりで書くとエラーか、意図しない上書きになります。くらべるときは必ずイコール 2 つです。
> と >= の取り違え「予算を超えたら」は >、「予算に達したら」は >= です。ちょうどの値の扱いが変わります。
True の大文字を忘れるPython の真偽値は True と False で、先頭が大文字です。true と書くと NameError になります。
他の言語の && や || は Python では使えません。SyntaxError になります。英単語の and or not を使います。
category == "食費" and "日用品" は意図した意味になりません。and の右側にも category == "日用品" のように完全な条件を書きます。
and と or を取り違える「食費かつ 1000 円以上」を or で書くと、100 円の食費もすべて当たってしまいます。日本語の「かつ」「または」と対応させて確認します。
"交通" や "交通 費" のように 1 文字でも違うと一致しません。全角と半角、余分な空白に注意します。
"食" in "食費" は True ですが、"食" in ["食費"] は False です。右側が何なのかで判定の意味が変わります。
in の左右を逆にするcategories in category と書くと意図が反転します。左が探す値、右が探される場所です。
/ と // の取り違え1000 / 3 は 333.3333333333333 という小数です。f"{1000 / 3}円" と書くと、とんでもない見た目になります。整数がほしいときは // です。
10 // 0 も 10 % 0 も ZeroDivisionError になります。人数のように「0 になりうる値」で割るときは注意が必要です。
% を百分率と思い込む50 % 100 は「50 パーセント」ではなく「50 を 100 で割った余りの 50」です。
0 <= price >= budget と書くと、意味の分からない条件になります。範囲を表すときは向きをそろえます。
and と or の強さを逆に覚えるand のほうが強く、先にまとまります。混ぜるときはかっこを付けます。
0 <= price <= budget を 0 <= price and <= budget と書くand の右側にも完全な条件が必要です。この形は SyntaxError になります。
if 条件 then A else B のような書き方は Python にはありません。値が先、if、条件、else、値の順です。
else を省略する三項演算子の else は必須です。省くと SyntaxError になります。式は必ず何らかの値にならなければいけないからです。
f-string の中で外と同じクオートを使うと文字列が途中で切れます。外が " なら内は ' です。
\n を付けてしまう3 行目のうしろに改行を足すと、見た目には分からない差でテストが落ちます。改行は行と行の間の 2 か所だけです。
つくる:予算チェックで詳しく読むマイナス付きの数字が出たら、この間違いです。どちらの枝にいるかを確認してください。
つくる:予算チェックで詳しく読むf を書き忘れる"合計 {total}円" と書くと、{total} が中身に置き換わらず、そのまま文字として出ます。
if price >= 1000 と書いて末尾の : を落とすと SyntaxError になります。if の行は必ずコロンで終わります。
半角スペース 4 つが基本です。タブと混ぜたり、2 つと 4 つが混在したりすると IndentationError になります。
= と == を取り違える条件で使うのは比較の == です。代入の = を書くと SyntaxError になります。
elif の順番が逆if price < 2000 を先に書くと、300 も 2000 未満なので「普通」で確定してしまい、「節約」に永遠に届きません。狭い条件から先に 書きます。
else に条件を書くelse price >= 2000: は SyntaxError です。条件を付けたいなら elif を使います。
elseif や else if と書くPython の綴りは elif です。他の言語の書き方をそのまま持ち込むと SyntaxError になります。
day == "土" or "日" と書くPython はこれを (day == "土") or ("日") と読みます。"日" は空でない文字列なので常に True 扱いになり、どの曜日でも週末になってしまいます。== は省略できません。
内側の if の中身は 12 個分下げます。8 個のままだと外側の if 直下の処理になり、意味が変わります。
and と or を取り違えるand は両方、or はどちらか一方です。「週末かつ高額」は and です。
case _ を書き忘れるどの case にも一致しないと match 全体が素通りされます。関数なら return に届かず None が返り、テストに落ちます。
case の値をクオートで囲まないcase 食費: と書くと、Python は 食費 という変数名だと解釈します。文字列と比べたいなら case "食費": です。
match の中の case で 1 段、case の中身でさらに 1 段下げます。関数の中なら case の中身は 12 個分になります。
上で見たとおりです。"FizzBuzz" が一度も出ない、という症状が出たらまず順番を疑います。
最後の枝で return n と書くと、7 という数値が返ります。期待されているのは文字列の "7" なので str(n) が必要です。
== を書き忘れるif n % 3: と書くと「余りが 0 でない」という逆の意味になります。余りが 0 かどうかを見るので n % 3 == 0 です。
or が True を返すと思い込む返るのは元の値です。"食費" or "その他" は True ではなく "食費" です。
or を使うprice or 100 と書くと 0 円が 100 になります。数値では if price is None: と明示的に書きます。
and と取り違える既定値の穴埋めは or です。and を使うと逆に、値があるときだけ右側が返ります。
name in "りんご" と左右を逆に書くin は左が探すもの、右が探される場所です。逆にすると意味が反転します。
or のたびに in を書き忘れるif "りんご" or "パン" in name: は "りんご" が常に True 扱いになるため、すべて食費になります。or でつなぐのは条件そのものです。
elif だけで終えると、どれにも当てはまらない品名で None が返ります。