Python面試題
作者 Aaron Cao · 更新於
預期會有三個層次:語言機制(例如可變性、產生器和裝飾器);執行期行為(例如GIL);以及資料結構方面的實際寫程式能力。大多數被拒案例源於對「為什麼」解釋得太單薄,而不是語法寫錯。
反覆出現的那些問題
把兩百道Python題目從頭刷到尾,看起來很努力,卻很少能改變面試結果。本節把範圍收窄到那些在電話面試和技術面試中反覆出現的少數問題,並說明一個有力的答案應該包含什麼。少數幾個語言特性承載了大部分的考察訊號。
- 可變預設引數。為什麼
def f(x=[])會在多次呼叫之間累積數值?預設值只在函式定義時求值一次,而不是每次呼叫都重新求值。 - 產生器與串列。
yield什麼時候比建立一個串列更好?當序列很大,或者你可能提前停止讀取時。 - 裝飾器。裝飾器實際回傳的是什麼?為什麼包裝函式需要
functools.wraps? - GIL。為什麼CPU密集型執行緒在CPython中無法很好地擴充?此時你會改用什麼?
- 淺拷貝與深拷貝。當用切片複製一個巢狀結構時,會出現什麼問題?
- 同一性與相等性。為什麼在shell中對小整數測試
is會得到一個具有誤導性的結果。
決定通過還是被刷掉的關鍵
兩位候選人可能給出完全相同、正確的GIL定義,但只有一位能進入下一輪。差別通常在第二句話。
一位在某公有雲端服務供應商面試L5後端工程師職位的候選人,被問到為什麼他們的服務在高負載下變慢。他先說出了GIL,然後繼續往下說:熱點路徑是JSON解析,所以執行緒不是合適的工具,把這一步搬移到處理程序集區後輸送量恢復了正常。說出限制因素只能拿到部分分數,把它和一個具體決策連結起來才能拿下這一輪。
把每個答案分成三個部分來組織:這個特性做什麼、它為什麼存在、以及你什麼時候會避免使用它。第三部分是大多數候選人會跳過的部分,也正是它體現出判斷力。關於寫程式題、行為面試和系統設計面試的其他文章,歸類在面試類型專題下。
如何準備,而不是死記硬背
讀懂一個答案和說出一個答案是兩種不同的能力,而面試考察的只是後者。請大聲練習,掐著時間,用你在真實通話中會用的措辭來說。
- 把每個反覆出現的問題的答案寫成三句話,然後不看稿子把它說出來。
- 挑出你每天都在用的兩個特性,為每一個準備一個誠實的侷限說明。能夠批評自己所用的工具,會顯得更有經驗。
- 準備一個真實的除錯故事:某次Python的行為讓你意外,而你後來弄清楚了原因。
- 把應用寫程式的部分單獨練習:字典、集合、帶key函式的排序,以及字串處理,涵蓋了大部分面試的考察範圍。
如果你想在真正面試之前,先和一個AI面試官進行一場限時模擬,可以前往模擬面試頁面。
即時助手能幫上什麼忙,又幫不上什麼忙
SubcueAI是一款針對macOS和Windows的原生桌面應用程式。它會擷取通話雙方的聲音,即時轉錄內容,並在一個懸浮視窗上顯示答題架構——這個懸浮視窗只留在你的本機,因此它不會以與會者或機器人的身分加入會議。對於Python面試環節來說,有用的輸出是一個結構提示,而不是一份現成的答案:具體內容必須由你自己來填,因為追問會圍繞你剛剛描述的程式碼展開。
誠實說明能力邊界,比強調能力本身更重要。如果你分享了螢幕,螢幕上的一切都會被分享出去。如果面試環節使用了監考評測平台,或是在公司代管的裝置上進行,助手工具就不在適用範圍內。設定與權限說明詳見教學頁面。