試験のためのプログラミング:高得点を取るPython解答
試験でフルマークを獲得するPythonコードの書き方 — 構造、エッジケース、プレッシャー下での時間管理。
試験の採点者はあなたのコードをデバッガで20分かけて実行することはありません。1回、多くて2回読んで、ルーブリックに照らし合わせるだけです。ルーブリックを無視して動く解答でも減点されることがあります。一方、すべてのチェックポイントに当てはまる少し粗い解答の方が高得点になることもあります。試験のためのPythonを書くことは、実際のプロジェクトのためのPythonを書くのとは違うスキルであり、別に練習する価値があります。
問題を2回読む前に、ルーブリックを読む
ほとんどのプログラミング試験 — AP CS Aスタイルの自由記述問題、大学の中間試験、コーディングブートキャンプの評価 — は部分点のルールを公開しています。ルーブリックの典型的な行は次のようになります。「ループ構造が正しければ1点、戻り値が正しければ1点、空のリストのケースに対応していれば1点」というようにです。正しい答えを得るが明示的なループをスキップした密集した1行の式を書くと、出力は正しくても採点者によっては減点することがあります。
何かを入力する前に、採点者が別々にチェックしそうな部分を特定しましょう:
- 関数シグネチャが要求されたものと正確に一致している(名前、パラメータの順序、戻り値の型)
- 再帰が想定される場合、ベースケースと再帰ケース
- ループの範囲(off-by-oneエラーは最も一般的な減点理由です)
- エッジケース:空の入力、1要素の入力、負の数、重複
これらをコメントとして先に書きましょう。# handle empty list、# base case: n == 0。これには10秒かかりますが、採点者が特に見ているケースを忘れないことが保証されます。
コードを部分点が見やすいように構成する
「リストの2番目に大きい数を返す関数を書きなさい」という問題への2つの解答を比較してみましょう:
def second_largest(nums):
return sorted(nums)[-2]
def second_largest(nums):
if len(nums) < 2:
return None
largest = second = float('-inf')
for n in nums:
if n > largest:
second = largest
largest = n
elif n > second and n != largest:
second = n
return second
1番目のものは形式の正しい入力には正しいですが、2つ未満の要素を持つリストではクラッシュします。また、[5, 5, 3]のような重複では間違った答えを返します(5を返しますが、仕様によってはおそらく間違い)。2番目のものは長いですが、すべてのルーブリック行 — エッジケース、正しい論理、正しい戻り値 — が明示的で、採点者がチェックできるそれぞれの行があります。時間制限のある試験では、2番目のバージョンは入力にかかる時間が長くても、ほぼ毎回高い得点になります。
過度に最適化しないで、明らかなバグも残さない
試験問題がBig-Oの知識をテストすることはめったにありません。プロンプトが「重複を見つける関数を書きなさい」と言っているなら、プロンプトが大規模入力を指定したり効率的な解を求めたりしない限り、O(n²)のネストされたループでいいです。プロンプトで求められていないセット ベースのO(n)アプローチへの変換に試験時間を費やすことは、戻ってこない時間です。
ただし、ルーブリックに関わらず常に減点されるエラーがあります:
==とisを矛盾なく使い分けられず論理バグを引き起こす(Pythonの試験では珍しいですが、比較が多い問題に出現します)- リストを反復処理しながら変更する —
for x in lst: lst.remove(x)は古典的な試験の罠で、静かに間違った出力を生じます returnを忘れて代わりに print する — 多くの自動採点者は stdout ではなく戻り値をチェックしますrange()でのoff-by-one —range(len(nums))とrange(len(nums) - 1)は書くたびに2重チェックする価値があります
コードを手で動かしてから提出する
紙の試験とほとんどのブラウザ内コーディング試験では、コードを実行できません。小さな例を1つ選んで、1行ずつ動かし、進むにつれて変数の値を書き下ろしましょう。これはロジックエラーの約80%を2分以内で見つけます。これは余った時間でできる単一で最も高い価値のあることです。
再帰関数については特に、少なくとも2レベル深く動かし、ベースケースが明示的に達成されることを書きましょう。採点者はベースケースが正しく終了することを示すこと自体に1点を与えることがあり、これは再帰ケースが正しいことの点とは別です。
時間を事後的な考えではなく、リソースとして管理する
自由記述セクションが3つの小問にわたって9点の価値がある場合、大体等しい時間を配分し、予算を超えて詰まっているなら進んでください — ほぼ正しい小問(b)を半分書いた方が、完璧な小問(a)と空白の小問(c)より生の点数で価値があります。正しいシグネチャとロジックが完成しなくても、passまたは推測を含むスタブ関数を書きましょう。正しいシグネチャだけで、ルーブリック上の1点の価値があることもあります。
試験室の外での整理されたテスト可能なPythonの書き方と、これらの問題で絶えず出現するデータ構造の詳細について、Korra Studio の関連 Python およびコンピュータサイエンスセクションをご覧ください。
この記事は AI の支援を受けて執筆し、Korra Studio の Michal Pilch(CISSP)が確認のうえ公開しました。
これは Korra Studio ナレッジベースの 1 つのノートです。プラットフォームはすべてのトピックと 1 対 1 メンタリングをペアで提供します。
無料で始めるarrow_forward