Python実践試験のコーディング作法・イディオム対策|PEP 8・Flake8・Blackを実行して確認
「実践試験の勉強をしているけど、PEP 8とかPythonらしい書き方って、どこまで覚えればいいの?」
「動くコードは書けるのに、選択肢の『どれが推奨される書き方か』で迷ってしまう…」
こんな悩み、ありますよね。Python 3 エンジニア認定実践試験は、主教材「Python実践レシピ」(技術評論社)の内容に沿って出題されます。この本は前半でコーディング規約(PEP 8・Flake8・Black)や言語仕様(内包表記・with文・関数の引数など)を扱っていて、ここが「書き方の作法」を問われる土台になっています。
この記事は、基礎試験レベルの文法は一通りわかる、実践試験を目指す中級者向けです。頻出パターン全体や標準ライブラリの話ではなく、「コーディング作法・イディオム」だけに絞って、実際にコードを動かしながら一緒に見ていきましょう!
なぜ実践試験で「作法・イディオム」が差になるのか

イメージとしては、基礎試験が「このコードは動くか?」を聞く試験だとすると、実践試験は「このコードはPythonとして素直な書き方か?」まで意識しておきたい試験です。
実践試験は40問・75分・合格ライン70%で、合格率は約48.6%。基礎試験(合格率 約76%)と比べるとぐっと絞られます。しかも公式の過去問集がないので、「なんとなく動けばOK」で書いてきた人ほど、選択肢の細かい違いで失点しがちです。
講師として15年教えてきて実感するのは、独学で書けるようになった人ほど range(len(...)) のクセが抜けないということです。動くので本人は困っていない。でも「より適切な書き方はどれか」と聞かれると、そのクセがそのまま迷いにつながります⚠️
ポイントをまとめるとこんな感じです👇
- コーディング規約:PEP 8 の命名・空白・空行・import のルールと、Flake8・Black が何をするツールか
- イディオム:enumerate・zip・内包表記・アンパック・
dict.getなど「Pythonらしい書き方」 - 落とし穴:
== None、ミュータブルなデフォルト引数など「動くけど推奨されない」書き方
イディオム①:インデックスで回さず enumerate と zip を使う
まずは一番よく見る「Pythonらしくない書き方」と「Pythonらしい書き方」を並べてみます。受講生の点数を表示して、合格者を抜き出すコードです。
# 受講生の点数データ
names = ["佐藤", "鈴木", "高橋"]
scores = [82, 67, 91]
# ❌ よく見る書き方:インデックスで回す
for i in range(len(names)):
print(i + 1, names[i], scores[i])
# ✅ Pythonらしい書き方:enumerate と zip
for no, (name, score) in enumerate(zip(names, scores), start=1):
print(no, name, score)
# ✅ 辞書の内包表記で「名前→点数」の辞書を作る
result = {name: score for name, score in zip(names, scores)}
print(result)
# ✅ 合格者だけをリスト内包表記で抜き出す(合格ライン70点)
passed = [name for name, score in result.items() if score >= 70]
print(passed)
# ✅ 存在しないキーは get で既定値を返す
print(result.get("田中", "未受験"))

実行してみると、上の2つのループはまったく同じ出力(1 佐藤 82・2 鈴木 67・3 高橋 91)になります。続いて辞書 {'佐藤': 82, '鈴木': 67, '高橋': 91}、合格者 ['佐藤', '高橋']、最後に 未受験 と表示されました。
同じ結果でも、「推奨される書き方」として選ぶべきなのは下の enumerate と zip を使った方です。ここが重要です👇
enumerate(..., start=1)で、番号を自分でi + 1しなくてよくなるzipで複数のリストを同時に回せる。for no, (name, score) in ...のようにアンパックを入れ子にできる- リストや辞書を「作るだけ」のループは、内包表記で1行にまとめられる
- キーがないかもしれない辞書は
result.get("田中", "未受験")のように既定値つきで取り出すと KeyError を防げる
イディオム②:実行せずに答えられますか? ひっかけ5問
ここで腕試しです。次のコードの出力を、実行せずに予想してみてください😊
# Q1:zip は長さが違うとどうなる?
print(list(zip("ABC", [1, 2])))
# Q2:enumerate の start は何を変える?
print(list(enumerate("xy", start=10)))
# Q3:アンパックで値を入れ替えると?
a, b = 1, 2
a, b = b, a
print(a, b)
# Q4:デフォルト引数にリストを使うと…?
def add_item(item, box=[]):
box.append(item)
return box
print(add_item("りんご"))
print(add_item("みかん"))
# Q5:None の判定はどちらが推奨?
value = None
print(value is None, value == None)
答えはこちら(実際に実行した結果です)。
[('A', 1), ('B', 2)]
[(10, 'x'), (11, 'y')]
2 1
['りんご']
['りんご', 'みかん']
True True
1つずつかみ砕いていきます。
- Q1:
zipは短い方に合わせて止まるので、"C"は捨てられます。エラーにはなりません - Q2:
startが変えるのは番号の開始値だけ。要素は先頭の"x"から始まります - Q3:
a, b = b, aは一時変数なしで値を入れ替える定番イディオムです - Q4:ここが一番のひっかけです。デフォルト引数の
[]は関数を定義したときに1回だけ作られるので、2回目の呼び出しでも同じリストが使い回され、['りんご', 'みかん']になります。box=Noneにして、関数の中でif box is None: box = []とするのが定石です - Q5:どちらも
Trueですが、PEP 8 では None との比較にis/is notを使うよう定めています
受講生を見ていると、Q4 は「答えを見ても、なぜそうなるのか腹落ちしない」と言われることが多い問題です。つまり「デフォルト値はいつ作られるか」という仕組みの理解がポイントなんですね。丸暗記より、一度自分で動かして確かめるのが一番の近道です。
コーディング規約:PEP 8 を Flake8 でチェックしてみる
次はコーディング規約です。PEP 8 は Python の公式なスタイルガイドで、命名・インデント・空白・空行・import の書き方などが決められています。試験対策としては、ルールを読むだけより、ツールに指摘させて覚えるのが効率的です。
わざと「PEP 8 違反だらけ」にしたコードを用意しました。
import os, sys
def calcAverage( scores ):
if scores == None:
return 0
total=0
for s in scores: total+=s
return total/len(scores)
print(calcAverage([82,67,91]))

このコード、実行すると 80.0 と正しく表示されます。動くんです。でも flake8 bad_style.py でチェックすると、13件も指摘されました(結果は上の画像のとおりです)。読み方のポイントはこうです👇
- E / W で始まるコード:pycodestyle による PEP 8 のスタイル違反(空白・空行・1行に複数の文 など)
- F で始まるコード:pyflakes による論理的な問題(使っていない import など)
- E401:import は1行に1つ
- E302 / E305:トップレベルの関数定義の前後は空行2行
- E711:None との比較は
is Noneを使う(さっきの Q5 ですね)
なお、関数名 calcAverage は PEP 8 の推奨(関数名は小文字+アンダースコアの snake_case)に反していますが、Flake8 の標準のチェックでは指摘されませんでした。ツールが黙っていても規約違反ではない、とは限らない点は覚えておきましょう。
Black は「整形」だけ。何が直って何が残るか
では、同じコードを自動整形ツールの Black にかけるとどうなるでしょうか。実際に試すと、空白・空行・1行に詰め込んだ for 文はきれいに整形されました。ところが、整形後のコードをもう一度 Flake8 にかけると、次の4件が残りました。
- F401
'os' imported but unusedと'sys' imported but unused(2件) - E401
multiple imports on one line - E711
comparison to None should be 'if cond is None:'
つまり、Black はコードの意味を変えずに見た目(レイアウト)を整えるツールなので、「使っていない import を消す」「== None を is None に書き換える」「関数名を変える」といったことはしません。「Flake8=チェックして指摘する」「Black=自動で整形する」と役割で区別しておくと、選択肢で迷わなくなります。
最後に、指摘をすべて直した版です。
def calc_average(scores):
"""点数リストの平均を返す(空や None なら 0)"""
if not scores:
return 0
return sum(scores) / len(scores)
print(calc_average([82, 67, 91]))
print(calc_average(None))
print(calc_average([]))
実行すると 80.0・0・0 と表示され、Flake8 の指摘は0件、Black でチェックしても変更なし(1 file would be left unchanged.)になりました。ポイントは次のとおりです👇
- 関数名を
calc_averageに(snake_case) - 合計は自分でループせず組み込みの
sum()を使う if not scores:で None も空リストもまとめて弾ける(空リストのときの ZeroDivisionError も防げる)
作法・イディオム対策の進め方
最後に、この分野の勉強の進め方をまとめます。
- 「Python実践レシピ」のコーディング規約と言語仕様の部分を、コードを打ちながら読む。読むだけで終わらせない
- 自分の過去のコードを Flake8 にかけてみる。指摘コード(E302、E711 など)の意味を1つずつ調べると、PEP 8 のルールが自然に頭に入ります
- 「動くけど推奨されない」書き方をノートにまとめる。
range(len(...))、== None、ミュータブルなデフォルト引数などを「NG → OK」の形で並べておくと、直前の見直しに使えます - 選択肢問題の形で演習する。実践試験は公式過去問集がないので、本番形式の問題で「どれが推奨か」を選ぶ練習を積むのが効果的です
4つ目の演習用に、筆者が運営するPython3エンジニア試験ラボの実践試験コースでは、「Python実践レシピ」の範囲に沿った本番形式の問題と解説を用意しています。協会非公認の独自教材ですが、演習量を確保したい方は選択肢の1つとして検討してみてください。
試験の最新の実施要項は、協会公式サイト(pythonic-exam.com)で確認しておきましょう。
まとめ
- 実践試験では「動くか」だけでなく「Pythonとして推奨される書き方か」まで意識しておく
range(len(...))より enumerate・zip、作るだけのループは内包表記、辞書は get で既定値zipは短い方に合わせて止まる/デフォルト引数のリストは定義時に1回だけ作られる、などのひっかけは自分で動かして確認- Flake8 は指摘するツール、Black は整形するツール。Black では
== Noneや未使用 import は直らない - PEP 8 は Flake8 の指摘コードを1つずつ調べながら覚えるのが効率的
「規約なんて覚えられない…」と感じていた方も、ツールに指摘させながら覚えれば『むずかしそう』が『できそう』に変わるはずです。ぜひ手元のコードで試してみてください🚀
よくある質問
Q. PEP 8 は全文を暗記する必要がありますか?
全文の暗記は不要です。命名規則(関数・変数は snake_case、クラスは CapWords)、インデントは空白4つ、トップレベルの定義の前後は空行2行、import は1行に1つ、None との比較は is を使う、といったよく使うルールをコードで確認しながら押さえるのがおすすめです。
Q. Flake8 や Black のコマンドのオプションまで覚えるべきですか?
まずは「Flake8 はコードをチェックして指摘する」「Black はコードを自動で整形する」という役割の違いを確実にしましょう。そのうえで、教材に出てくる基本的な使い方を手元で実行しておくと安心です。出題範囲の詳細は協会公式サイトをご確認ください。
Q. イディオムを使わない書き方は、試験では「間違い」になりますか?
動作としては正しいコードも多いです。ただ、「より適切な書き方はどれか」と問われたときに選べるかどうかが差になります。普段から「もっと短く・素直に書けないか」を意識して書くクセをつけておきましょう。
\ 受験前に、今の実力を無料でチェック /
本記事の筆者が運営する試験対策の専門サービスでは、本番と同じ形式の模擬試験(基礎・実践・データ分析 各1回分)を無料で受験できます。クレジットカードの登録は不要です。
▶ 試験の全体像・勉強法のまとめは完全ガイドへ
こちらも読まれています
📚 関連商品・おすすめ書籍
※本記事にはアフィリエイトリンクが含まれます。




