考試程式設計:高分的 Python 答案
如何在考試中寫出真正能得滿分的 Python 程式碼——結構、邊界情況和壓力下的時間管理。
考試評分者不會用偵錯器跑你的程式碼二十分鐘。他們讀一次、也許兩次,然後對照評分標準檢查。一個忽略評分標準的可運行解法仍會失分,而一個稍微不完美但命中每個檢查點的解法反而能得更高分。為考試寫 Python 程式碼是一種不同於為實際專案寫程式碼的技能,值得單獨練習。
讀評分標準,然後再讀兩次題目
大多數程式設計考試——AP CS A 風格的自由作答題、大學期中考、程式設計訓練營評估——都會公開部分加分的規則。典型的評分標準行看起來像是:「迴圈結構正確得 1 分,回傳值正確得 1 分,處理空清單情況得 1 分。」如果你寫了一個得到正確答案的濃縮單行但跳過了明確的迴圈,某些評分者會扣分,即使輸出是對的。
開始輸入任何東西之前,先識別評分者可能會分別檢查的部分:
- 函式簽名完全符合所要求的(名稱、參數順序、回傳型別)
- 基礎情況和遞迴情況,如果預期要遞迴
- 迴圈邊界(差一錯誤是最常見的失分原因)
- 邊界情況:空輸入、單元素輸入、負數、重複值
先用註解寫下這些。# handle empty list、# base case: n == 0。這只需要十秒鐘,確保你不會忘記評分者特別會看的情況。
結構化程式碼以展示部分加分
比較兩個「寫一個回傳清單中第二大數字的函式」的答案:
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
第一個在輸入格式良好時是正確的,但在少於兩個元素的清單上會當機,並在 [5, 5, 3] 這樣有重複值的清單上給出錯誤答案(回傳 5,依據規格也許是錯的)。第二個更長,但每個評分標準行——邊界情況、正確邏輯、正確回傳值——都是明確的,各占一行讓評分者能逐一檢查。在有時間限制的考試中,第二個版本幾乎每次都得分更高,即使它花費更長時間輸入。
不要提前優化,也不要放著明顯的漏洞
考試題目很少測試 Big-O 知識,除非他們直接說了。如果題目說「寫一個尋找重複值的函式」,嵌套迴圈達到 O(n²) 就可以了,除非題目指定了大輸入或要求高效解法。花考試時間轉換成基於集合的 O(n) 方法,當初並沒有人要求,這是你拿不回來的時間。
也就是說,某些錯誤無論評分標準如何都會扣分:
- 不一致地使用
==而不是is,造成邏輯漏洞(Python 考試很少見,但在比較密集的題目中會出現) - 在迭代清單時改變它——
for x in lst: lst.remove(x)是經典的考試陷阱,會產生無聲的錯誤輸出 - 忘記
return而改成印出——許多自動評分系統檢查的是回傳值,不是標準輸出 range()中的差一錯誤——range(len(nums))對比range(len(nums) - 1)每次寫的時候都值得雙檢
在提交前用手寫跡象追蹤你的程式碼
在紙本考試和大多數瀏覽器內程式碼考試中,你沒辦法執行程式碼。選一個小例子,一行一行追蹤,邊走邊寫下變數值。這在兩分鐘內能抓到大概 80% 的邏輯錯誤,這是你可以用剩餘時間做的單一最高價值的事。
對於遞迴函式,特別要追蹤至少兩層深,明確寫出基礎情況的命中。評分者常常單獨給一分就為了示範基礎情況正確終止,與遞迴情況正確的那一分分開。
像管理資源一樣管理時鐘,不是事後想到
如果自由作答部分跨三個子問題價值 9 分,大概平均分配時間,如果卡住超過那個預算就往下走——一個半完成但幾乎正確的部分 (b) 比完美的部分 (a) 加上空白的部分 (c) 值更多原始分數。即使你完成不了邏輯,也要用正確的簽名寫一個虛設函式和 pass 或一個猜測;單單正確的簽名有時本身就是評分標準中的一個分數。
如需更多關於在考試之外寫清潔、可測試的 Python,以及在這些問題中經常出現的資料結構,請查看 Korra Studio 上的相關 Python 和電腦科學段落。
本文由 AI 協助撰寫,經 Michal Pilch(CISSP)審核並發佈,Korra Studio。
這是 Korra Studio 知識庫中的一篇筆記——該平台將每個主題與一對一的師資配對。
免費開始arrow_forward