- Pythonの結果が想定と違うときは、怪しい処理の前後で、値・型・通った場所をprintで確認します。
- 表示には名前を付け、期待した値と比較。一度に一か所ずつ直します。
- printは原因を探す手がかりです。秘密情報を表示せず、確認用の表示は提出前に整理します。
エラーは出ないのに計算結果がおかしい、条件文が思った方へ進まない。そんなPython初心者が、自分の短い学習用コードを調べるための記事です。エラー文の意味から知りたい場合は、先にPythonのエラーの読み方を確認してください。ここでは、処理の途中で何が起きたかを調べます。
printデバッグは「期待と実際の差」を探す方法
printは値を文字として出力する組込み関数です。print自体が不具合を直すわけではありません。確認用の表示をコードへ一時的に入れ、入力から結果までのどこで想定と違ったかを探す使い方を、ここではprintデバッグと呼びます。
最初に「この入力なら、この結果になるはず」を一つ書いてください。目的が曖昧なまま表示を増やすと、値を見ても正しいか判断できません。教材の問題なら、入力条件と正解例を先に読み直します。自分の作品なら、何をしたい処理なのかを一文にします。
- 期待:入力と、出てほしい結果を書く
- 観察:怪しい処理の前後で値を表示
- 比較:最初に食い違った場所を探す
- 再確認:一か所変更し、同じ入力で試す
| 現象 | 最初に見る情報 | 表示の例 |
|---|---|---|
| 計算結果が違う | 計算前の値と型、計算後の結果 | print("price:", price, type(price)) |
| 条件文が想定と違う | 条件に使う値、条件式、通った分岐 | print("eligible:", age >= 18) |
| 空欄や空白が気になる | 文字列の表現と長さ | print("name:", repr(name), len(name)) |
| 繰り返しが多い・少ない | 反復番号とその回の値 | print("index:", i, "value:", value) |
これは原因を断定する表ではなく、次に観察する情報を選ぶ表です。未定義の名前を表示すればNameErrorになるので、変数が作られた後に置きます。また、実行されない処理の中へ置くと何も表示されません。見たい値が存在する位置かも確認してください。
例:300のつもりが「100100100」になった
以下は説明用に作った短い例です。単価100、数量3から合計300を出したいのに、実際には違う文字が表示されます。
price = "100"
quantity = 3
total = price * quantity
print(total)
# 100100100
結果だけを見て掛け算を別の演算へ変える前に、掛け算へ渡している値を確認します。
price = "100"
quantity = 3
print("price:", repr(price), type(price).__name__)
print("quantity:", quantity, type(quantity).__name__)
total = price * quantity
print("total:", repr(total))
# price: '100' str
# quantity: 3 int
# total: '100100100'
priceは数値ではなく文字列(str)です。文字列と整数の掛け算は繰り返しになるため、この例ではエラーなく文字列が3回続きます。数値の合計が目的なら、例えばtotal = int(price) * quantityにすると300になります。文字列の繰り返しが目的なら、元の処理が正しいこともあります。
ただし、実際の入力には空欄や「百」など、intで変換できない文字もあり得ます。単にintを足して完成とせず、受け入れる入力と、受け入れない場合の対応を仕様に合わせて決めます。上の例は価格入力フォームの完成品ではありません。
reprとtypeは何が違う?
repr(value)は値の表現を確認するものです。文字列では引用符や改行の表現が手がかりになります。type(value)は型を調べます。例えば数字に見える「100」が文字列なのか整数なのかを分けられます。全ての複雑なオブジェクトが詳しく表示されるとは限りません。
条件分岐では「値・条件式・通った側」を見る
条件文が期待どおりに進まないときは、条件式の直前に表示を置きます。次は「18以上なら対象」という学習用の条件です。実際のサービスの年齢条件を示すものではありません。
age = 18
print("age:", age, "eligible:", age >= 18)
if age >= 18:
print("branch: eligible")
else:
print("branch: not eligible")
# age: 18 eligible: True
# branch: eligible
境界の17・18・19で試すと、18を含める条件かどうかが見えます。ここで仕様は「18以上」なのにage > 18と書けば、18だけ想定と食い違います。表示を見て境界に気づいたら、比較演算子だけを変え、同じ3つの入力で再確認します。
関数の中のprintが出ない場合は、関数を定義しただけで呼び出していないこともあります。途中で例外が発生して、確認したい行まで来ていない場合もあります。実行ファイルとエラー表示を合わせて確認します。
便利な一方、大量出力と秘密情報に注意
メリットは追加ライブラリなしで、小さなコードの値や分岐を確認しやすいことです。一方、繰り返しの中で毎回表示すると必要な情報が埋もれます。表示を追加したことで処理時間や順序に影響する場合もあり、出力が出たことだけでは正しさを証明できません。
長い処理、複雑な呼び出し、同時実行の問題では、printだけで追い続けるより、デバッガや適切なログを使う方が調べやすい場合があります。勤務先の本番システムへ無断で表示を足す方法には向きません。担当者の手順と権限を優先してください。
- パスワード、APIキー、個人情報を丸ごと表示しない。
- 学習には架空データを使い、相談先へ送る前にも出力を見直す。
- 観察用の表示にはラベルを付け、必要な箇所だけに絞る。
- 確認が終わったら、提出物の出力を汚さないよう一時表示を整理する。
まとめ:観察した事実を修正と相談に使う
- 期待値を決め、値・型・分岐を必要な場所で表示する。
- 最初に期待と違った位置を探し、一か所ずつ直す。
- 同じ入力に加え、境界の入力でも結果を再確認する。
- 秘密情報と一時表示を整理してから共有する。
入力:[ ]
期待した結果:[ ]
表示した場所と値:[ ]
期待と最初に違った点:[ ]
変更した一か所:[ ]
変更後の結果・残った疑問:[ ]
次は今のコードの怪しい処理の前後に、名前付きのprintを一つずつ入れてください。差が見つからなければ、質問テンプレートに観察結果を整理します。直った理由と確認した条件は学習記録へ残せます。
技術情報の最終確認:2026年10月10日。Python公式のprint・repr・type、シーケンスの演算を参照。コードと確認手順は学習用の編集部作成例です。