答案頁 · 12 道題

Python 上下文管理器練習答案

本頁彙整 Python 上下文管理器 的 12 道練習。先做練習頁,再回到這裡核對準確答案和原因。

快速答案

本答案頁包含 Python 上下文管理器 的 4 道選擇題、4 道填空題和 4 道輸出預測題,每題都給出準確答案和簡短解釋。

答案已完整展示,建議先嘗試作答,再用本頁核對。第一次練習最好從互動練習頁開始。

01 · 選擇題

哪兩個方法讓物件成為上下文管理器?

  1. __get__ 和 __set__
  2. __enter__ 和 __exit__正確答案
  3. __iter__ 和 __next__
  4. __init__ 和 __repr__

答案: __enter__ 和 __exit__

為什麼: with 語句會在主體前呼叫 __enter__,主體後呼叫 __exit__。

02 · 選擇題

__exit__ 什麼時候被呼叫?

  1. 只有檔案為空時
  2. __enter__ 之前
  3. with 程式碼區塊退出時正確答案
  4. 只有 __enter__ 失敗時

答案: with 程式碼區塊退出時

為什麼: 無論主體成功還是拋出例外,__exit__ 都會執行。

03 · 選擇題

程式碼的輸出結果是什麼?

class C:
    def __enter__(self):
        return "ok"
    def __exit__(self, *args):
        pass
with C() as value:
    print(value)
  1. C
  2. None
  3. ok正確答案
  4. True

答案: ok

為什麼: __enter__ 回傳的值會綁定到 as 後面的變數。

04 · 選擇題

contextlib.contextmanager 要求函式裡有什麼?

  1. 一個 print
  2. 一個 yield正確答案
  3. 一個 return
  4. 一個類

答案: 一個 yield

為什麼: yield 之前是準備,yield 之後是清理。

05 · 填空題

補全打開受管理程式碼區塊的語句。

____ open("note.txt", "w") as f:
    f.write("hi")

答案: with

為什麼: with 開始一個受管理的程式碼區塊,並保證清理。

06 · 填空題

補全準備資源的方法。

class C:
    def ____(self):
        return self

答案: __enter__

為什麼: __enter__ 準備資源,並回傳綁定到 as 的值。

07 · 填空題

補全清理方法。

class C:
    def ____(self, exc_type, exc, tb):
        pass

答案: __exit__

為什麼: with 程式碼區塊結束時執行 __exit__。

08 · 填空題

補全分隔準備與清理的關鍵字。

from contextlib import contextmanager
@contextmanager
def c():
    ____ 1

答案: yield

為什麼: contextmanager 用 yield 作為準備與清理的邊界。

09 · 輸出預測

螢幕上會顯示什麼?

class C:
    def __enter__(self):
        return "ok"
    def __exit__(self, *args):
        return False
with C() as value:
    print(value)

答案: ok

為什麼: __enter__ 回傳的值是 ok。

10 · 輸出預測

這段程式碼會輸出什麼?

from contextlib import contextmanager
@contextmanager
def value():
    yield 7
with value() as number:
    print(number + 1)

答案: 8

為什麼: 管理器產出七,七加一等於八。

11 · 輸出預測

執行結果是什麼?

class C:
    def __enter__(self):
        return 2
    def __exit__(self, *args):
        pass
with C() as n:
    print(n * 3)

答案: 6

為什麼: 管理器回傳二,二乘三等於六。

12 · 輸出預測

這段程式列印出什麼?

from contextlib import contextmanager
@contextmanager
def label():
    yield "x"
with label() as text:
    print(text.upper())

答案: X

為什麼: 管理器產出 x,upper 把它變成 X。

先試一遍題目

打開 Python 上下文管理器 練習頁,用即時回饋回答同樣的 12 道題。

練習本課