Python入門:基礎文法編のよくある間違い

レッスンの本文で注意している点を、つまずきの側から195件ぶん並べ直しました。書いた覚えのある形が見つかったら、 そのままレッスンに戻って前後を読めます。

printで表示

レッスンを読む

return を書き忘れる

print("=== おこづかい帳 ===") とだけ書くと、画面には出ますが関数の戻り値は None になり、テストは失敗します。必ず return で返します。

printで表示で詳しく読む

クオートの閉じ忘れ

return "=== おこづかい帳 == のように閉じるクオートがないと SyntaxError になります。開いたら必ず閉じます。

printで表示で詳しく読む

全角の記号を使ってしまう

print() のように全角のかっこを書くとエラーになります。記号はすべて半角で書きます。日本語を打つ設定のまま記号を入力すると起こりがちです。

printで表示で詳しく読む

文字列の連結

レッスンを読む

空白を入れ忘れる

name + price_text と書くと りんご120 とくっつきます。+ " " + を挟むのを忘れないでください。半角スペースと全角スペースは別の文字なので、必ず半角にします。

文字列の連結で詳しく読む

引数を文字列のクオートで囲んでしまう

return "name" + " " + "price_text" と書くと、引数の中身ではなく name price_text という文字がそのまま返ります。引数を使うときはクオートで囲みません。

文字列の連結で詳しく読む

を付け忘れる

最後の + "円" が抜けると りんご 120 になります。テストは 1 文字違うだけで落ちるので、末尾まで見直します。

文字列の連結で詳しく読む

結果をクオートで囲んでしまう

return "budget - price1 - price2" と書くと、計算されずにその文字がそのまま返ります。計算式はクオートで囲みません。

四則演算で詳しく読む

掛け算に x を使う

budget x 2Python では文法エラーです。掛け算はアスタリスク * と決まっています。

四則演算で詳しく読む

引く順番をかっこで間違える

budget - (price1 - price2) と書くと 3000 - 402960 になってしまいます。今回はかっこは不要です。

四則演算で詳しく読む

末尾に余分な \n を付ける

+ "\n" で締めくくると、目に見えない差でテストが失敗します。改行は行と行の 間 にだけ入れます。

実行順序で詳しく読む

\n を全角で書く

¥n や全角の n では改行になりません。半角のバックスラッシュと半角の n を使います。日本語キーボードでは ¥ キーで入力できます。

実行順序で詳しく読む

関数を定義する前に呼ぶ

def より上で呼び出すと NameError になります。定義が先、呼び出しがあと、という順番を守ります。

実行順序で詳しく読む

全角の を使う

見た目は似ていますが、Python はコメントとして扱いません。SyntaxError になります。記号は半角で入力します。

コメントで詳しく読む

文字列の中の # をコメントだと思う

print("#1 りんご")# はただの文字で、コメントにはなりません。クオートの中は文字列として扱われます。

コメントで詳しく読む

コメントで処理を止めたつもりが式が壊れる

return price1 + # price2 のように式の途中で # を書くと、右辺が消えて SyntaxError になります。コメントアウトは行ごとに行います。

コメントで詳しく読む

エラーを読んでみる

レッスンを読む

エラーの一番上だけ読む

上のほうは Python の内部の呼び出し履歴で、原因は いちばん下 に書いてあります。下から読むのが鉄則です。

エラーを読んでみるで詳しく読む

エラーを消すために処理を消す

動かない行をまるごと削ればエラーは消えますが、必要な処理まで消えます。直すのであって、消すのではありません。

エラーを読んでみるで詳しく読む

つくる:レシート表示

レッスンを読む

末尾に \n を付けてしまう

"合計 200円" のうしろに改行を足すと、見た目には分からない差でテストが落ちます。改行は行と行の間だけです。

つくる:レシート表示で詳しく読む

左右を逆に書く

"りんご" = name はエラーになります。入れる先の名前は必ず左です。

変数で詳しく読む

入れる前に使う

print(label)label = ... より前に書くと NameError になります。まだその名前を知らないからです。エラーメッセージが名前をそのまま教えてくれます。

変数で詳しく読む

名前を打ち間違える

price_textprice_txt と書くと、別の変数を新しく作ったことになります。エラーが出ずに結果だけ狂うこともあるので、名前は正確に写します。

変数で詳しく読む

typeで型を調べる

レッスンを読む

type の結果をそのまま比べようとする

type(120)"int" という文字列ではありません。文字列がほしいときは必ず .__name__ を付けます。

typeで型を調べるで詳しく読む

type を変数名に使ってしまう

type = "食費" と書くと、以降 type が命令として使えなくなります。組み込みの名前は変数名に使いません。

typeで型を調べるで詳しく読む

数値への変換

レッスンを読む

int の結果を受け取らない

int(price_text) と書くだけでは何も起きません。price = int(price_text) のように変数に入れるか、そのまま return する必要があります。

数値への変換で詳しく読む

変換したつもりで文字列を足す

int(price_text) + "80"TypeError です。片方だけ変換しても、もう片方が文字列なら混ぜられません。

数値への変換で詳しく読む

文字列への変換

レッスンを読む

str を付け忘れる

name + " " + price + "円"TypeError です。エラーメッセージは can only concatenate str と出ます。「文字列にしか足せない」という意味なので、数値のほうを str で包みます。

文字列への変換で詳しく読む

全体を str で包んでしまう

str(name + " " + price + "円") と書いても直りません。かっこの中で先に連結が起きて、そこで落ちるからです。包むのは price だけです。

文字列への変換で詳しく読む

strint を取り違える

名前が短いので逆に書きがちです。str は文字列にする、int は整数にする、と結果の型で覚えます。

文字列への変換で詳しく読む

None を 0 や空文字と同じに扱う

型が違うので、type の結果も str にしたときの見た目も変わります。未入力を表したいときだけ None を使います。

boolとNoneで詳しく読む

先頭の f を忘れる

"{name} {price}円" は波かっこごと文字として残ります。実行してもエラーが出ないので気づきにくく、表示を見て初めて分かります。

f-stringで詳しく読む

波かっこの中をクオートで囲む

f"{'name'} {price}円" と書くと、変数ではなく name という文字がそのまま入ります。かっこの中の変数名にクオートは付けません。

f-stringで詳しく読む

かっこの外に空白を入れ忘れる

f"{name}{price}円"りんご120円 になります。空白が必要なら {}{} の間に自分で書きます。

f-stringで詳しく読む

入力を受け取る

レッスンを読む

split の結果を 1 つの変数で受ける

name = text.split(" ") と書くと、切り分けた 2 つがまとめて name に入ります。左に 2 つ名前を並べます。

入力を受け取るで詳しく読む

区切りが全角スペースになっている

split(" ") は半角スペースで切ります。全角スペースで打たれた文字列は切れません。

入力を受け取るで詳しく読む

つくる:入力できるおこづかい帳

レッスンを読む

比較演算子

レッスンを読む

=== の書き間違い

total = budget は代入なので、比較のつもりで書くとエラーか、意図しない上書きになります。くらべるときは必ずイコール 2 つです。

比較演算子で詳しく読む

>>= の取り違え

「予算を超えたら」は >、「予算に達したら」は >= です。ちょうどの値の扱いが変わります。

比較演算子で詳しく読む

True の大文字を忘れる

Python の真偽値は TrueFalse で、先頭が大文字です。true と書くと NameError になります。

比較演算子で詳しく読む

論理演算子

レッスンを読む

記号で書いてしまう

他の言語の &&||Python では使えません。SyntaxError になります。英単語の and or not を使います。

論理演算子で詳しく読む

条件をつなげたつもりで比較を省く

category == "食費" and "日用品" は意図した意味になりません。and の右側にも category == "日用品" のように完全な条件を書きます。

論理演算子で詳しく読む

andor を取り違える

「食費かつ 1000 円以上」を or で書くと、100 円の食費もすべて当たってしまいます。日本語の「かつ」「または」と対応させて確認します。

論理演算子で詳しく読む

カテゴリ名の文字を間違える

"交通""交通 費" のように 1 文字でも違うと一致しません。全角と半角、余分な空白に注意します。

in演算子で詳しく読む

文字列とリストを混同する

"食" in "食費"True ですが、"食" in ["食費"]False です。右側が何なのかで判定の意味が変わります。

in演算子で詳しく読む

in の左右を逆にする

categories in category と書くと意図が反転します。左が探す値、右が探される場所です。

in演算子で詳しく読む

剰余と切り捨て除算

レッスンを読む

/// の取り違え

1000 / 3333.3333333333333 という小数です。f"{1000 / 3}円" と書くと、とんでもない見た目になります。整数がほしいときは // です。

剰余と切り捨て除算で詳しく読む

連鎖比較と優先順位

レッスンを読む

三項演算子

レッスンを読む

語順を間違える

if 条件 then A else B のような書き方は Python にはありません。値が先、if、条件、else、値の順です。

三項演算子で詳しく読む

else を省略する

三項演算子の else は必須です。省くと SyntaxError になります。式は必ず何らかの値にならなければいけないからです。

三項演算子で詳しく読む

クオートを重ねる

f-string の中で外と同じクオートを使うと文字列が途中で切れます。外が " なら内は ' です。

三項演算子で詳しく読む

つくる:予算チェック

レッスンを読む

末尾に \n を付けてしまう

3 行目のうしろに改行を足すと、見た目には分からない差でテストが落ちます。改行は行と行の間の 2 か所だけです。

つくる:予算チェックで詳しく読む

if文の基本

レッスンを読む

コロンを忘れる

if price >= 1000 と書いて末尾の : を落とすと SyntaxError になります。if の行は必ずコロンで終わります。

if文の基本で詳しく読む

インデントがずれる

半角スペース 4 つが基本です。タブと混ぜたり、2 つと 4 つが混在したりすると IndentationError になります。

if文の基本で詳しく読む

if / elif / else

レッスンを読む

elif の順番が逆

if price < 2000 を先に書くと、3002000 未満なので「普通」で確定してしまい、「節約」に永遠に届きません。狭い条件から先に 書きます。

if / elif / elseで詳しく読む

elseifelse if と書く

Python の綴りは elif です。他の言語の書き方をそのまま持ち込むと SyntaxError になります。

if / elif / elseで詳しく読む

条件の組み合わせ

レッスンを読む

day == "土" or "日" と書く

Python はこれを (day == "土") or ("日") と読みます。"日" は空でない文字列なので常に True 扱いになり、どの曜日でも週末になってしまいます。== は省略できません。

条件の組み合わせで詳しく読む

インデントを 1 段しか下げない

内側の if の中身は 12 個分下げます。8 個のままだと外側の if 直下の処理になり、意味が変わります。

条件の組み合わせで詳しく読む

case _ を書き忘れる

どの case にも一致しないと match 全体が素通りされます。関数なら return に届かず None が返り、テストに落ちます。

match文で詳しく読む

case の値をクオートで囲まない

case 食費: と書くと、Python食費 という変数名だと解釈します。文字列と比べたいなら case "食費": です。

match文で詳しく読む

インデントが 1 段足りない

match の中の case で 1 段、case の中身でさらに 1 段下げます。関数の中なら case の中身は 12 個分になります。

match文で詳しく読む

定番:FizzBuzz判定

レッスンを読む

数値のまま返す

最後の枝で return n と書くと、7 という数値が返ります。期待されているのは文字列の "7" なので str(n) が必要です。

定番:FizzBuzz判定で詳しく読む

== を書き忘れる

if n % 3: と書くと「余りが 0 でない」という逆の意味になります。余りが 0 かどうかを見るので n % 3 == 0 です。

定番:FizzBuzz判定で詳しく読む

デフォルト値とor

レッスンを読む

つくる:カテゴリ自動判定

レッスンを読む

or のたびに in を書き忘れる

if "りんご" or "パン" in name:"りんご" が常に True 扱いになるため、すべて食費になります。or でつなぐのは条件そのものです。

つくる:カテゴリ自動判定で詳しく読む

total = 0 の書き忘れ

用意していない名前にいきなり足そうとすると NameError になります。ループの前に必ず初期値を置きます。

forで合計で詳しく読む

return をループの中に書いてしまう

return total がインデントの内側にあると、1 周目で関数が終わってしまい、最初の 1 件だけが返ります。return はループの外、for と同じ深さより手前に置きます。

forで合計で詳しく読む

リストそのものを足してしまう

total = total + prices と書くと、数値とリストを足すことになり TypeError です。足すのは取り出した 1 件の price です。

forで合計で詳しく読む

whileで繰り返す

レッスンを読む

カウンタを進め忘れる

i = i + 1 を書き忘れると、同じ 1 件を永久に読み続けます。手元で試すときは、止まらなくなったら Ctrl + C で強制終了できます。

whileで繰り返すで詳しく読む

i = i + 1break の前に置いてしまう

位置そのものは動きますが、終了items に入れてしまう順番になっていないか、必ず読み返します。取り込むのは 終了 ではない行だけです。

whileで繰り返すで詳しく読む

while の条件を i <= len(inputs) にしてしまう

最後の 1 件を読んだあと、存在しない位置を読もうとして IndexError になります。件数が 3 なら読める位置は 0 と 1 と 2 までです。

whileで繰り返すで詳しく読む

終わりの値を 1 つ足し忘れる

range(1, last_day, step) と書くと最終日が出ません。last_day まで含めたいなら last_day + 1 です。

rangeとstepで詳しく読む

数値と文字列をそのまま足す

day + "日目"TypeError になります。str(day) で文字列に変えてからつなぎます。

rangeとstepで詳しく読む

step0 を渡してしまう

range の刻み幅に 0 は使えず、ValueError になります。刻み幅は必ず 0 以外です。

rangeとstepで詳しく読む

breakとcontinue

レッスンを読む

breakcontinue を取り違える

0 円を飛ばすつもりで break を書くと、最初の 0 円で集計が止まってしまいます。飛ばしたいのか終わりたいのか、書く前に決めます。

breakとcontinueで詳しく読む

continue の下に処理を書いて実行されると思い込む

continue より下の行は、その周では絶対に動きません。「書いたのに動かない」の原因になりがちです。

breakとcontinueで詳しく読む

whilecontinue を使ってカウンタを飛ばす

while の中で continue すると、カウンタを進める行を飛ばしてしまい無限ループになります。whilecontinue の組み合わせは特に慎重に扱います。

breakとcontinueで詳しく読む

enumerateで番号付け

レッスンを読む

毎周のうしろに改行を足す

result = result + str(i) + ". " + name + "\n" と書くと、最後の行のうしろにも改行が残ります。改行は行の 手前 に足すと、この問題が起きません。

enumerateで番号付けで詳しく読む

zipで組み合わせ

レッスンを読む

zip に渡し忘れる

for name, price in names: と書くと、品名 1 文字ずつを 2 つに分けようとして ValueError になります。組にするには zip が要ります。

zipで組み合わせで詳しく読む

長さのずれに気づかない

zip は短いほうで止まり、余った分を黙って捨てます。件数が合うことを前提にするなら、len を比べて確かめる処理を別途書きます。

zipで組み合わせで詳しく読む

入れ子ループ

レッスンを読む

行の入れ物を初期化する位置を間違える

line = "" を外側のループより前に書くと、すべての行がつながってしまいます。行ごとにリセットする必要があります。

入れ子ループで詳しく読む

内側と外側で同じ変数名を使う

内側でも i を使うと、外側の i が上書きされて表が崩れます。外側は i、内側は j のように分けます。

入れ子ループで詳しく読む

break が外側まで効くと思い込む

breakcontinue は、いちばん内側のループ 1 つにしか効きません。内側で break しても、外側は次の周に進みます。

入れ子ループで詳しく読む

つくる:何件でも記録

レッスンを読む

金額とカテゴリを文字列に変え忘れる

record["price"] は数値なので、str を挟まないと TypeError です。record["category"] は最初から文字列なのでそのままつなげます。

つくる:何件でも記録で詳しく読む

空のときの分岐を書き忘れる

記録が 0 件でもループは静かに 0 周で終わるため、エラーは出ません。記録がありません の行が抜けたまま気づかない、というのがありがちです。

つくる:何件でも記録で詳しく読む

関数を定義する

レッスンを読む

コロンと字下げを忘れる

def greet_user(name) とコロンを書かないと SyntaxError です。字下げがないと IndentationError になります。字下げは半角スペース 4 つに揃えます。

関数を定義するで詳しく読む

呼び出しでかっこを付け忘れる

greet_user とだけ書くと、関数そのものを指すだけで実行されません。greet_user("たろう") とかっこを付けて初めて動きます。

関数を定義するで詳しく読む

return を書かずに print で済ませる

画面には出ますが、戻り値は None になります。採点は戻り値を見るので、必ず return で返します。

関数を定義するで詳しく読む

引数と戻り値

レッスンを読む

引数の順番を間違える

位置引数は前から順に入ります。split(people, total) のように順を取り違えると、エラーは出ないのに答えだけが狂います。いちばん見つけにくい種類のバグです。

引数と戻り値で詳しく読む

引数の数が合わない

add_tax() のように渡し忘れると TypeError になり、missing 1 required positional argument と教えてくれます。多すぎても同じく TypeError です。

引数と戻り値で詳しく読む

/// を取り違える

price * 110 / 100 は小数の 132.0 になります。132 とは別の値なので、テストは落ちます。整数が欲しいときは // です。

引数と戻り値で詳しく読む

デフォルト引数

レッスンを読む

リストや辞書を既定値にする

呼び出しをまたいで同じものが使い回されます。None を既定値にして関数の中で作り直します。

デフォルト引数で詳しく読む

境界を取り違える

>= にすると 3000 円ちょうどでもオーバー扱いになります。>>= のどちらが仕様かを確かめてから書きます。

デフォルト引数で詳しく読む

キーワード引数

レッスンを読む

引数名を間違える

format_record("りんご", 120, categoly="食費") のように綴りを間違えると TypeError になり、unexpected keyword argument と出ます。定義側の綴りを確認します。

キーワード引数で詳しく読む

同じ引数を二重に渡す

format_record("りんご", 120, "食費", category="日用品") は、category に位置とキーワードの両方から値が来るので TypeError です。どちらか片方にします。

キーワード引数で詳しく読む

str を忘れて数値を連結する

name + " " + priceTypeError です。金額は数値なので、str(price) で文字列にしてからつなぎます。第 2 章でやった変換がここでも要ります。

キーワード引数で詳しく読む

複数の戻り値

レッスンを読む

return を 2 行書く

return total の次の行に return average と書いても、2 行目には決して届きません。return は関数を終わらせるので、1 つの return にカンマで並べます。

複数の戻り値で詳しく読む

受け取る変数の数が合わない

total, average, count = total_and_average(prices)ValueError です。not enough values to unpack と出ます。

複数の戻り値で詳しく読む

引数の順番を逆にする

divmod(people, total) と書くと divmod(3, 1000) になり、商が 0 で余りが 3 という意味の分からない答えが返ります。エラーが出ないぶん厄介です。

divmodで詳しく読む

タプルのまま返してしまう

この環境の判定はリスト形式なので、return divmod(total, people) では通りません。q, r = divmod(...) で受けてから [q, r] にします。

divmodで詳しく読む

変数のスコープ

レッスンを読む

関数の外の変数を直接書き換えようとする

UnboundLocalError になります。global で押し切らず、引数と戻り値の形に直します。

変数のスコープで詳しく読む

戻り値を受け取り忘れる

add_record(records, "りんご", 120, "食費") とだけ書いて records = を付けないと、新しいリストは捨てられ、何も増えません。エラーが出ないぶん気づきにくい間違いです。

変数のスコープで詳しく読む

キーの名前を間違える

キーは namepricecategory の 3 つです。namae などと書くと、あとで取り出すときに落ちます。

変数のスコープで詳しく読む

lambdareturn を書く

lambda r: return r["price"]SyntaxError です。lambda は式なので、return は書きません。

lambda関数で詳しく読む

key に呼び出した結果を渡す

key=lambda r: r["price"]() のようにかっこを付けると、金額を関数として呼ぼうとして TypeError になります。渡すのは関数そのものです。

lambda関数で詳しく読む

sortsorted を取り違える

records.sort() は元のリストを並べ替えて None を返します。新しいリストが欲しいときは sorted です。戻り値が None になっていたら、まずここを疑います。

lambda関数で詳しく読む

つくる:関数に分割

レッスンを読む

over を文字列にする

"オーバー" のような文字列ではなく、TrueFalse の真偽値を入れます。判定結果は真偽値で返し、言葉にするのは表示側の仕事です。

つくる:関数に分割で詳しく読む

リストの追加と削除

レッスンを読む

無い値を remove する

["りんご"].remove("みかん")ValueError になり、プログラムがそこで止まります。メッセージは list.remove(x): x not in list です。消す前に if "みかん" in items で存在を確かめるのが基本の対策です。

リストの追加と削除で詳しく読む

append の戻り値を受け取る

items = items.append("ノート") と書くと itemsNone になり、次の行で TypeError が出ます。append は呼ぶだけにします。

リストの追加と削除で詳しく読む

終了位置を含むと思い込む

items[0:3] は 4 件ではなく 3 件です。「終了の手前まで」と覚えます。取れた件数が 1 つ足りない、多いと感じたらここを疑います。

スライスで詳しく読む

items[-3]items[-3:] を混同する

コロンが無いと 1 件だけ、あるとリストが返ります。前者の戻り値は辞書や文字列、後者はリストです。

スライスで詳しく読む

空リストで items[0] を読む

[] に対する items[0]IndexError です。len(items) で件数を確かめるか、スライスを使えば避けられます。

スライスで詳しく読む

辞書の基本

レッスンを読む

キーのクオートを忘れる

record[name] と書くと、name という変数を探しに行ってしまいます。変数が無ければ NameError です。キーを直接書くときは record["name"] とクオートで囲みます。

辞書の基本で詳しく読む

無いキーを読む

record["memo"]KeyError になります。in で確認するか、キーが無くても落ちない record.get("memo") を使います。get は無いとき None を返します。

辞書の基本で詳しく読む

リストと辞書のかっこを取り違える

[] はリスト、{} は辞書です。{"name", "price"} のようにコロンを書き忘れると、辞書ではなく別のものになります。

辞書の基本で詳しく読む

辞書を走査

レッスンを読む

for key, value in record と書く

items() を付けずに 2 つ受け取ろうとすると ValueError になります。辞書をそのまま回すと 1 周ごとにキーが 1 つ返るだけなので、2 つに分けられません。

辞書を走査で詳しく読む

+ でつなぐときに int を混ぜる

key + " = " + valuevalue120 だと TypeError です。f-string を使うか str(value) で変換します。

辞書を走査で詳しく読む

末尾に改行を足してしまう

ループの中で + "\n" を付けると最後の行にも改行が残ります。join を使えばこの問題は起きません。

辞書を走査で詳しく読む

keyでソート

レッスンを読む

key に呼び出し結果を渡す

key=lambda r: r["price"]() のようにかっこを足すと関数ではなくなります。渡すのは関数そのもので、呼ぶのは sorted の仕事です。

keyでソートで詳しく読む

キーの名前を間違える

r["prise"] のようなつづり違いは KeyError になります。エラーメッセージに無いキー名がそのまま出るので、見比べれば分かります。

keyでソートで詳しく読む

降順を -1 などで表そうとする

降順は reverse=True です。sorted(...)[::-1] でも見た目は逆順になりますが、同じ値どうしの並びが変わってしまうことがあるため reverse を使います。

keyでソートで詳しく読む

setで重複除去

レッスンを読む

集合をそのまま返す

return set(...) と書くと、順番が定まらないうえに型もリストではありません。テストの比較も安定しません。必ず sorted でリストにしてから返します。

setで重複除去で詳しく読む

番号で取り出そうとする

集合には順番が無いので categories[0]TypeError になります。取り出したいなら先にリストへ変換します。

setで重複除去で詳しく読む

リスト内包表記

レッスンを読む

append を書いてしまう

[result.append(r) for r in records] と書くと、append の戻り値である None が並んだリストができます。内包表記の中では append は要りません。

リスト内包表記で詳しく読む

if の位置を間違える

絞り込みの iffor の うしろ です。前に書く [a if 条件 else b for ...] は第 3 章の三項演算子で、絞り込みではなく値の切り替えになります。

リスト内包表記で詳しく読む

タプルアンパック

レッスンを読む

要素の数が合わない

3 つ入った組を name, price = pair で受けると ValueError になります。メッセージは too many values to unpack です。数を合わせるか、pair[0] のように番号で取ります。

タプルアンパックで詳しく読む

タプルを書き換えようとする

pair[1] = 150TypeError です。変えたいなら新しいタプルを作り直すか、最初からリストを使います。

タプルアンパックで詳しく読む

つくる:カテゴリ別集計

レッスンを読む

初回の KeyError

存在確認をせずに足そうとすると、そのカテゴリが初めて出てきた時点で止まります。in で確認するか、無いとき 0 を返す totals.get(category, 0) を使います。

つくる:カテゴリ別集計で詳しく読む

ファイルを読み込む

レッスンを読む

close を書き忘れる

開いたまま放置するとファイルが解放されず、書き込んだ内容が反映されないことがあります。次のレッスンで学ぶ with を使えばこの問題は消えます。

ファイルを読み込むで詳しく読む

戻り値が文字列のまま

read の結果をそのまま return すると、行のリストではなく 1 本の文字列が返ります。splitlines を通してからにします。

ファイルを読み込むで詳しく読む

ファイルに書き込む

レッスンを読む

withで安全に扱う

レッスンを読む

コロンとインデントを忘れる

with open(path, "w") as f の行末にはコロンが必要で、次の行はインデントします。忘れると SyntaxError になります。

withで安全に扱うで詳しく読む

ブロックの外で f を使う

ブロックを抜けたあとに f.read() を呼ぶと ValueError になります。閉じたファイルは読めません。

withで安全に扱うで詳しく読む

CSV形式で保存

レッスンを読む

str を付け忘れる

",".join([name, price, category]) のように int を混ぜると TypeError になります。エラーメッセージは sequence item 1 と、何番目が悪いかを教えてくれます。

CSV形式で保存で詳しく読む

区切り文字を混同する

項目の区切りは ","、行の区切りは "\n" です。両方 join で書くので取り違えやすい部分です。

CSV形式で保存で詳しく読む

品名にカンマが入る

"りんご, みかんセット" のようにカンマを含む品名を保存すると、読み戻したときに項目数が合わなくなります。このコースでは品名にカンマを使わない前提にしますが、実務では標準ライブラリの csv を使ってこの問題を避けます。

CSV形式で保存で詳しく読む

try-exceptで備える

レッスンを読む

except の範囲を広げすぎる

except: とだけ書くと、あらゆる例外を飲み込んでしまいます。本当のバグまで隠れて原因が追えなくなるので、受け止める種類は必ず書きます。

try-exceptで備えるで詳しく読む

try の範囲を広げすぎる

try のブロックに関係ない処理まで入れると、どこで失敗したのか分からなくなります。危ない 1 行だけを囲むのが基本です。

try-exceptで備えるで詳しく読む

except で何もしない

except ValueError: pass と書くと、失敗を無視して先に進みます。今回は 0 を返すという後始末があるので、pass は使いません。

try-exceptで備えるで詳しく読む

例外の種類

レッスンを読む

except の種類を間違える

except ValueError では FileNotFoundError を受け止められません。関係のない種類を書くと、例外はそのまま素通りして止まります。

例外の種類で詳しく読む

trywith を入れ忘れる

with の外側だけ try で囲んでも意味がありません。open が呼ばれる場所が try の中に入っている必要があります。

例外の種類で詳しく読む

None の判定に == を使う

initial_text is not None と書きます。空文字も「渡された」として扱いたいので、if initial_text: では空文字が省略扱いになってしまいます。

例外の種類で詳しく読む

つくる:保存機能

レッスンを読む

int に戻し忘れる

金額が "120" のまま返ると、見た目は似ていてもテストは落ちます。辞書に入れる前に int(price) を通します。

つくる:保存機能で詳しく読む

キーの順番や名前を変える

保存の形式は namepricecategory の順です。読み戻すときも同じ順で受け取ります。キー名は第 7 章から一貫して英語です。

つくる:保存機能で詳しく読む

書き込みのあと読まずに records を返す

テストは通ってしまうかもしれませんが、保存できたことの確認になりません。必ずファイル経由で戻します。

つくる:保存機能で詳しく読む

全機能を統合しよう

レッスンを読む

command[0] 以外を先に取り出してしまう

["summary"] は要素が 1 つしかないので、いきなり command[1] を読むと IndexError になります。操作名で分岐したあと、その枝の中で取り出します。

全機能を統合しようで詳しく読む

月間レポート機能

レッスンを読む

remaining を合計の途中で計算する

ループの中で引くと、最後の記録を足す前の値が残ります。引き算はループを抜けたあとです。

月間レポート機能で詳しく読む

予算オーバーを 0 で止める

使いすぎたときの remaining は負の数のままにします。-500 と出るからこそ、いくら超えたのかが分かります。

月間レポート機能で詳しく読む

in の向きを逆にする

record["name"] in keyword と書くと、品名がキーワードに含まれるかという逆の判定になります。ほとんどの場合ずっと偽になります。

自由拡張で詳しく読む

見つからないときに None を返す

呼び出し側が for で回した瞬間に TypeError になります。空のリストを返します。

自由拡張で詳しく読む

元のリストから消しながら探す

remove で絞り込もうとすると、元の記録が壊れます。新しいリストに集めるのが安全です。

自由拡張で詳しく読む