Python実践試験の頻出問題パターン3つと解き方のコツ|実行結果・コード選択・エラー判定
「実践試験の問題って、結局どんな形で出るの?」「知識はあるはずなのに、選択肢を見ると迷ってしまう…」
Python 3 エンジニア認定実践試験の勉強をしていると、こんな悩みにぶつかりますよね。実践試験は40問・75分・合格ライン70%で、合格率は約48.6%。基礎試験(合格率 約76%)よりぐっと難しくなります。
この記事では、実践試験の問題演習でよく見かける「問題の型(パターン)」を3つに分けて、それぞれの解き方のコツを、実際に動かしたコード付きで解説します。対象は、基礎試験レベルの文法はひと通りわかっていて、実践試験の問題演習でつまずいている方です。
出題範囲やモジュールごとの知識ではなく、「問題をどう読んで、どう選択肢を絞るか」という解き方に絞ってお話しします。一緒に見ていきましょう!
実践試験の問題は「3つの型」で整理できる

実践試験の問題は、出てくるモジュールこそいろいろですが、問われ方で分けるとだいたい次の3つに整理できます。
| 型 | 問われ方 | 必要な力 |
|---|---|---|
| パターン1 | このコードの実行結果はどれか | 頭の中でコードを1行ずつ追うトレース力 |
| パターン2 | 目的どおりに動くコードはどれか | 選択肢を「条件」に照らして消していく力 |
| パターン3 | エラーになるのはどれか | 例外の種類と「エラーにならない境界」の知識 |
イメージとしては、「追う問題」「比べる問題」「疑う問題」の3種類です。型ごとに頭の使い方が違うので、問題を見た瞬間に「これはどの型か」を判断できるだけで、迷う時間がかなり減ります。
75分で40問なので、1問あたりに使えるのは平均で約1分50秒。型を見分けて解き方を決め打ちできるかどうかが、時間内に解き切れるかを左右します。
パターン1:実行結果を選ぶ問題(トレース力)
まずは「次のコードを実行したときの出力はどれか」という型です。これ、実行せずに答えられますか?👇(実際に実行した結果は、コードのすぐ下に載せています)
# パターン1:実行結果を選ぶ問題(トレース力)
# (1) ミュータブルなデフォルト引数
def add_item(item, box=[]):
box.append(item)
return box
print(add_item("A"))
print(add_item("B"))
# (2) ループ内で作った lambda
funcs = [lambda: i * 10 for i in range(3)]
print([f() for f in funcs])
# (3) 対策版:デフォルト引数で「その時点の値」を固定する
funcs_fixed = [lambda i=i: i * 10 for i in range(3)]
print([f() for f in funcs_fixed])

ポイントをまとめるとこんな感じです。
- デフォルト引数のリストは、関数を定義したときに1回だけ作られる。だから2回目の呼び出しでは前回の
"A"が残ったまま['A', 'B']になる - ループ内の
lambdaは、呼び出した時点のiを見にいく。呼ぶのはループが終わったあとなので、全部i = 2で[20, 20, 20] lambda i=i:のようにデフォルト引数にすると、その時点の値が固定されて[0, 10, 20]になる
ここが重要です👇 この型の選択肢には、「素直に読んだときの答え」(['B'] や [0, 10, 20])が混ぜてあることが多いです。直感で出した答えが選択肢にあっても、すぐに飛びつかないのがコツです。
解き方のコツ
- メモ用紙に変数の値の変化を表で書く。頭の中だけで追わない
- 「いつ作られるか」「いつ評価されるか」に注目する。デフォルト引数・クロージャ・ジェネレータは、このタイミングが問われやすいポイント
- 直感の答えが選択肢にあったら、「引っかけ用の選択肢ではないか」と一度だけ疑う
講師として受講生の答案を見ていると、ミュータブルなデフォルト引数のような問題は「知ってはいるのに本番で落とす」代表格です。解説を読んで「あ、知ってた…」となる方がとても多いんですよね。知識不足よりも、手で追う手間を省いたことが原因になっているケースがほとんどです。
パターン2:目的どおりに動くコードを選ぶ問題(消去法)
次は「〇〇したい。正しく動くコードはどれか」という型です。例として「年齢の昇順、同じ年齢なら名前の昇順に並べる」という目的で、4つの選択肢を実際に動かして比べてみました。
# パターン2:「目的に合うコードを選ぶ」問題
# 目的:年齢の昇順、同じ年齢なら名前の昇順に並べる
people = [
{"name": "Sato", "age": 30},
{"name": "Abe", "age": 25},
{"name": "Kato", "age": 30},
{"name": "Ito", "age": 25},
]
expected = ["Abe", "Ito", "Kato", "Sato"]
def choice_a(data):
return sorted(data, key=lambda p: (p["age"], p["name"]))
def choice_b(data):
# 名前で並べてから、年齢で並べ直す(2段階ソート)
tmp = sorted(data, key=lambda p: p["name"])
return sorted(tmp, key=lambda p: p["age"])
def choice_c(data):
return sorted(data, key=lambda p: p["age"])
def choice_d(data):
return data.copy().sort(key=lambda p: (p["age"], p["name"]))
for label, func in [("A", choice_a), ("B", choice_b), ("C", choice_c), ("D", choice_d)]:
result = func(people)
names = [p["name"] for p in result] if result else result
print(label, names, "○" if names == expected else "×")
実行結果はこうなりました。
A ['Abe', 'Ito', 'Kato', 'Sato'] ○
B ['Abe', 'Ito', 'Kato', 'Sato'] ○
C ['Abe', 'Ito', 'Sato', 'Kato'] ×
D None ×
ポイントをまとめるとこんな感じです。
- A:タプルをキーにすると「年齢 → 名前」の順で比較されるので正解
- B:一見回りくどいですが、
sorted()は安定ソート(キーが同じ要素は元の順番を保つ)なので、これも正解 - C:年齢だけで並べているので、30歳の2人が元の順番(Sato → Kato)のまま。条件を満たさない
- D:
list.sort()は並べ替えた結果を返さずNoneを返すので不正解
B のように「見慣れない書き方だけど実は正しい」選択肢があるのが、この型のいやらしいところです。「なんとなく変だから×」で切ってしまうと、正解を消してしまうことがあります。
解き方のコツ
- 問題文の目的を条件に分解してから選択肢を見る(今回なら「①年齢の昇順」「②同じ年齢は名前の昇順」「③結果がリストで返る」)
- 条件を1つずつ当てて、満たさない選択肢を消していく。「正解を探す」より「不正解を消す」ほうが速くて確実
- 戻り値が
Noneになるメソッド(list.sort()・list.append()・dict.update()など)が使われていたら、それだけで消せることが多い - 「正しいものはどれか」なのか「誤っているものはどれか」なのか、問題文の最後まで確認してから選ぶ
パターン3:エラーになるものを選ぶ問題(境界の知識)
最後は「エラーになるのはどれか」「どの例外が送出されるか」という型です。よく出てくる操作を6つ並べて、実際にどうなるか確かめてみました(実行結果はコードのすぐ下です)。
# パターン3:「エラーになるのはどれか」を問う問題
cases = [
("A", lambda: (1, 2, 3).append(4)),
("B", lambda: "3" + 4),
("C", lambda: {"a": 1}["b"]),
("D", lambda: {"a": 1}.get("b")),
("E", lambda: [1, 2, 3][5:10]),
("F", lambda: int("3.5")),
]
for label, func in cases:
try:
print(label, "エラーなし →", repr(func()))
except Exception as e:
print(label, type(e).__name__)

ポイントをまとめるとこんな感じです。
- タプルには
appendがないのでAttributeError - 文字列と数値の足し算は
TypeError。int("3.5")は型は文字列で合っていても、整数として読めない値なのでValueError - 辞書の
["b"]はKeyErrorですが、.get("b")はエラーにならずNoneを返す - リストのスライスは範囲外でもエラーにならず、空リスト
[]になる(インデックスの[5]ならIndexError)
この型で狙われやすいのは、D や E のような「エラーになりそうで、ならないもの」です。私のUdemy講座の受講生からも「スライスが範囲外でもエラーにならないのを知らなかった」という声を何度ももらいました。エラーになるものを覚えるより、エラーにならない例外的なケースを押さえるほうが得点につながります。
解き方のコツ
TypeError(型が合わない)とValueError(型は合っているが値がおかしい)の違いを、一言で説明できるようにしておく- 「
[]と.get()」「インデックスとスライス」のように、エラーになる版とならない版をペアで覚える - 勉強中に迷ったら、
try/exceptで実際に例外名を表示してみる。上のコードのようにまとめて確かめられる形にしておくと、復習にも使えます
3つの型を本番で使い分ける時間配分のコツ
型がわかったら、最後は時間の使い方です。1問平均約1分50秒なので、次のように進めるのがおすすめです。
- 1周目:問題を見て型を判断。パターン3のように知識で即答できるものはその場で解き、トレースが長くなりそうなパターン1の問題は見直し用の印を付けて後回し
- 2周目:後回しにした問題を、メモに変数の変化を書きながらじっくり解く
- 残り時間:印を付けた問題を中心に、引っかけの選択肢に飛びついていないかを確認
型の見分けと時間配分を本番形式の問題で練習したい方は、筆者が運営する実践試験 対策コースも参考にしてみてください。なお、こちらは協会非公認の独自教材です。実施要項などの最新情報は、協会公式サイト(pythonic-exam.com)でご確認ください。
まとめ
- 実践試験の問題は「実行結果を選ぶ」「目的どおりのコードを選ぶ」「エラーになるものを選ぶ」の3つの型で整理できる
- パターン1は変数の値をメモに書いてトレース。直感の答えが選択肢にあったら一度疑う
- パターン2は目的を条件に分解して消去法。見慣れない書き方でも正しい選択肢がある
- パターン3は「エラーになりそうでならない」ケースをペアで覚える
- 1問あたり平均約1分50秒。型を見分けて、時間がかかる問題は後回しにする
「むずかしそう」に見える実践試験も、問題の型がわかれば「できそう」に変わります。この記事のコードを手元で動かして、選択肢の作られ方を体感してみてください。ぜひ試してみてください😊
よくある質問
Q1. 実践試験の問題数・試験時間・合格ラインは?
40問・75分で、合格ラインは70%です。受験料は税込13,200円(学割6,600円)です。最新の実施要項は協会公式サイトをご確認ください。
Q2. 実践試験に公式の過去問集はありますか?
公式の過去問集はありません。主教材の「Python実践レシピ」(技術評論社)で知識を固めつつ、この記事のようにコードを実際に動かして挙動を確かめる練習を重ねるのがおすすめです。
Q3. 実行結果を選ぶ問題は、全部頭の中で追うべきですか?
短いコードなら頭の中でも大丈夫ですが、ループや関数呼び出しが絡むものはメモに変数の値を書きながら追うほうがミスが減ります。時間がかかりそうなら後回しにして、先に即答できる問題を片付けましょう。
\ 本番形式の模擬試験を無料で試せます /
筆者が運営するPython3エンジニア試験ラボでは、基礎・実践・データ分析の3試験について、本試験と同じ形式の模擬試験を各1回分、無料で受験できます(クレジットカード登録不要)。本番の操作感と自分の実力チェックにどうぞ。
▶ 試験の全体像・勉強法のまとめは完全ガイドへ
文法から固め直したい方へ:筆者が運営する無料の入門コース「作って学ぶPythonプログラミング入門」(全7章52レッスン)もあります。
こちらも読まれています
📚 関連商品・おすすめ書籍
※本記事にはアフィリエイトリンクが含まれます。





