return を書き忘れる
print("=== おこづかい帳 ===") とだけ書くと、画面には出ますが関数の戻り値は None になり、テストは失敗します。必ず return で返します。
レッスンの本文で注意している点を、つまずきの側から45件ぶん並べ直しました。書いた覚えのある形が見つかったら、 そのままレッスンに戻って前後を読めます。
return を書き忘れるprint("=== おこづかい帳 ===") とだけ書くと、画面には出ますが関数の戻り値は None になり、テストは失敗します。必ず return で返します。
return "=== おこづかい帳 == のように閉じるクオートがないと SyntaxError になります。開いたら必ず閉じます。
print() のように全角のかっこを書くとエラーになります。記号はすべて半角で書きます。日本語を打つ設定のまま記号を入力すると起こりがちです。
name + price_text と書くと りんご120 とくっつきます。+ " " + を挟むのを忘れないでください。半角スペースと全角スペースは別の文字なので、必ず半角にします。
return "name" + " " + "price_text" と書くと、引数の中身ではなく name price_text という文字がそのまま返ります。引数を使うときはクオートで囲みません。
円 を付け忘れる最後の + "円" が抜けると りんご 120 になります。テストは 1 文字違うだけで落ちるので、末尾まで見直します。
return "budget - price1 - price2" と書くと、計算されずにその文字がそのまま返ります。計算式はクオートで囲みません。
x を使うbudget x 2 は Python では文法エラーです。掛け算はアスタリスク * と決まっています。
budget - (price1 - price2) と書くと 3000 - 40 で 2960 になってしまいます。今回はかっこは不要です。
\n を付ける+ "\n" で締めくくると、目に見えない差でテストが失敗します。改行は行と行の 間 にだけ入れます。
\n を全角で書く¥n や全角の n では改行になりません。半角のバックスラッシュと半角の n を使います。日本語キーボードでは ¥ キーで入力できます。
def より上で呼び出すと NameError になります。定義が先、呼び出しがあと、という順番を守ります。
# を使う見た目は似ていますが、Python はコメントとして扱いません。SyntaxError になります。記号は半角で入力します。
# をコメントだと思うprint("#1 りんご") の # はただの文字で、コメントにはなりません。クオートの中は文字列として扱われます。
return price1 + # price2 のように式の途中で # を書くと、右辺が消えて SyntaxError になります。コメントアウトは行ごとに行います。
上のほうは Python の内部の呼び出し履歴で、原因は いちばん下 に書いてあります。下から読むのが鉄則です。
SyntaxError は原因の 1 行あとを指すことがあります。指摘された行に問題が無ければ、上の行を疑います。
動かない行をまるごと削ればエラーは消えますが、必要な処理まで消えます。直すのであって、消すのではありません。
エラーを読んでみるで詳しく読む\n を付けてしまう"合計 200円" のうしろに改行を足すと、見た目には分からない差でテストが落ちます。改行は行と行の間だけです。
120円 の 1 2 0 は半角、円 は全角です。数字を全角で打つと別の文字になり、一致しません。
見出しはイコール = が半角 3 つ、内側は半角スペース 1 つずつです。== や ==== では通りません。
__name__ のアンダースコアの数を間違える前後とも 2 本ずつで合計 4 本です。1 本だと AttributeError になります。
type の結果をそのまま比べようとするtype(120) は "int" という文字列ではありません。文字列がほしいときは必ず .__name__ を付けます。
type を変数名に使ってしまうtype = "食費" と書くと、以降 type が命令として使えなくなります。組み込みの名前は変数名に使いません。
int の結果を受け取らないint(price_text) と書くだけでは何も起きません。price = int(price_text) のように変数に入れるか、そのまま return する必要があります。
int("1200円") は ValueError です。円 を含めずに数字だけを渡します。
int(price_text) + "80" は TypeError です。片方だけ変換しても、もう片方が文字列なら混ぜられません。
str を付け忘れるname + " " + price + "円" は TypeError です。エラーメッセージは can only concatenate str と出ます。「文字列にしか足せない」という意味なので、数値のほうを str で包みます。
str で包んでしまうstr(name + " " + price + "円") と書いても直りません。かっこの中で先に連結が起きて、そこで落ちるからです。包むのは price だけです。
str と int を取り違える名前が短いので逆に書きがちです。str は文字列にする、int は整数にする、と結果の型で覚えます。
true や none は NameError です。True False None はすべて先頭が大文字です。
"True" は str です。bool がほしいときはクオートを付けません。
None を 0 や空文字と同じに扱う型が違うので、type の結果も str にしたときの見た目も変わります。未入力を表したいときだけ None を使います。
f を忘れる"{name} {price}円" は波かっこごと文字として残ります。実行してもエラーが出ないので気づきにくく、表示を見て初めて分かります。
f"{'name'} {price}円" と書くと、変数ではなく name という文字がそのまま入ります。かっこの中の変数名にクオートは付けません。
f"{name}{price}円" は りんご120円 になります。空白が必要なら {} と {} の間に自分で書きます。
input の結果をそのまま計算に使う戻り値は必ず str です。int を通さないと TypeError になります。
split の結果を 1 つの変数で受けるname = text.split(" ") と書くと、切り分けた 2 つがまとめて name に入ります。左に 2 つ名前を並べます。
split(" ") は半角スペースで切ります。全角スペースで打たれた文字列は切れません。
3 行目の 合計 ...円 が必要です。品物 1 件なので金額は同じですが、行としては別に用意します。
f-string を使わずに + で書く場合は str(price) が必要です。忘れると TypeError になります。
合計 120円 のうしろに \n を足すと、見た目では分からない差でテストが落ちます。改行は行と行の間だけです。