{
  "assessmentTests": {
    "python_test": {
      "name": "Python 測驗",
      "desc": "30 道關於語法、函式、資料結構和物件行為的場景題 — 判斷你對 Python 的理解是否與職位要求的 Python 工作能力相符。",
      "recommendation": "你的 Python 技能概覽",
      "results": {
        "beginner": {
          "name": "初級",
          "desc": "你能讀懂一個短腳本，改改裡面的數值，但你錯的題往往涉及 Python 特有的行為，而不是通用程式設計邏輯 — 比如預設引數只構建一次還是重用，is 和 == 對兩個看起來一樣的列表有什麼不同，或者在函式裡只要你對某個變數賦值，它就變成區域變數。這些都不是說你程式設計能力不行；這些是 Python 特有的規則，從其他語言轉過來的人或初學者都容易踩雷。在工作中很重要，因為每一個這樣的坑都是程式碼乍一看沒問題但其實有 bug 的地方。",
          "recommendation": "先集中學三樣東西，按這個順序：可變的預設引數（為什麼 basket=[] 很危險）、is 和 == 的區別、以及函式內變數作用域怎麼工作。Python 官方文件 docs.python.org 直接講了這三個，搜「Python gotchas」能找到大量講解和例子。"
        },
        "intermediate": {
          "name": "中級",
          "desc": "你日常腳本寫得很順手 — 資料結構、控制流、直白的函式 — 日常維護工作或在現有程式碼庫上加小功能不會有什麼壓力。從這裡到高級的差距主要是 Python 便利特性互相作用時會發生什麼：淺複製會留下巢狀資料共享（本以為是複製了），生成器的返回值悄悄不成為輸出的一部分，裝飾器堆疊順序容易搞反。這些是資深審查員十秒鐘就能指出、其他人要花一小時追的 bug。",
          "recommendation": "專注物件和迭代的內部機制：淺複製和深複製、生成器的 return 真正做什麼、裝飾器堆疊順序怎麼工作。然後學類的基礎知識，很多教程跳過了 — 沒有自訂 __eq__ 的預設相等性，為什麼一個可變的類屬性會在所有例項間共享。"
        },
        "advanced": {
          "name": "高級",
          "desc": "這是大多數職位招募資訊說的「熟練 Python」的等級。你知道該用哪個工具不用費力翻，你清楚為什麼某塊共享狀態會變，不只是知道它變了；讀別人的函式能正確預判它的輸出。從這個等級到頂部的差別在防守工作：知道哪種看起來正確的做法一旦涉及類屬性、只能傳關鍵字的引數或異常繼承體系就會出問題。",
          "recommendation": "深入那些保護別人也要動的程式碼庫的東西：關鍵字唯一引數作為 API 設計選擇而不只是語法怪癖、異常繼承體系（這樣 except 子句才能捕住正確的錯誤族，不只是一個類）、上下文管理器作為保證清理的標準方式。Real Python 的深度文章對這三個都是很好的下一步。"
        },
        "expert": {
          "name": "專家",
          "desc": "你在每一部分都拿了高分 — 核心語法、函式和作用域、資料結構、物件程式設計習語。實際上這意味著你可以被丟進陌生人的程式碼檔案，解釋為什麼它產生那個輸出，而不只是語法說它應該產生什麼 — 這才是難的、更有價值的技能。在這個等級，原生語言很少是你工作的限制因子；限制通常來自你周圍系統的規模和形狀。",
          "recommendation": "收益現在來自工具和審查：用 mypy 或 pyright 做靜態型別檢查，在最佳化前先做效能分析而不是猜，讀別人的 pull request 找的就是這一類 bug — 通過了所有測試但在特定輸入下還是做錯事的。如果你在競聘某個職位，講一個你找到的這樣的 bug，而不是只列語言特性 — 這展示的是你的推理能力，不只是詞彙。"
        }
      },
      "questions": [
        {
          "question": "你寫 def add_item(item, basket=[]): basket.append(item); return basket，然後呼叫 add_item('a') 和 add_item('b')，兩次都不傳 basket 引數。第二次呼叫返回什麼？",
          "options": [
            {
              "icon": "",
              "label": "['b']"
            },
            {
              "icon": "",
              "label": "引發 TypeError"
            },
            {
              "icon": "",
              "label": "['a', 'b']"
            },
            {
              "icon": "",
              "label": "['a']"
            }
          ]
        },
        {
          "question": "a = [1, 2, 3] 和 b = [1, 2, 3]。a == b 返回什麼，a is b 返回什麼？",
          "options": [
            {
              "icon": "",
              "label": "兩者都是 True"
            },
            {
              "icon": "",
              "label": "== 為 True，is 為 False"
            },
            {
              "icon": "",
              "label": "兩者都是 False"
            },
            {
              "icon": "",
              "label": "is 為 True，== 為 False"
            }
          ]
        },
        {
          "question": "在 Python 3 中，7 / 2 計算為多少，7 // 2 計算為多少？",
          "options": [
            {
              "icon": "",
              "label": "3.5 然後 3"
            },
            {
              "icon": "",
              "label": "3 然後 3.5"
            },
            {
              "icon": "",
              "label": "3.5 然後 3.5"
            },
            {
              "icon": "",
              "label": "3 然後 3"
            }
          ]
        },
        {
          "question": "s = 'hello'，然後你執行 s[0] = 'H'。會發生什麼？",
          "options": [
            {
              "icon": "",
              "label": "s 變成 'Hello'"
            },
            {
              "icon": "",
              "label": "s 變成 'Hhello'"
            },
            {
              "icon": "",
              "label": "引發一個 TypeError"
            },
            {
              "icon": "",
              "label": "什麼都不發生，s 仍是 'hello'"
            }
          ]
        },
        {
          "question": "x = [10, 20, 30, 40, 50]。x[1:4] 返回什麼？",
          "options": [
            {
              "icon": "",
              "label": "[20, 30, 40, 50]"
            },
            {
              "icon": "",
              "label": "[10, 20, 30, 40]"
            },
            {
              "icon": "",
              "label": "[20, 30, 40]"
            },
            {
              "icon": "",
              "label": "[30, 40]"
            }
          ]
        },
        {
          "question": "name = 'Ana' 和 age = 30。f'{name} is {age}' 產生什麼？",
          "options": [
            {
              "icon": "",
              "label": "{name} is {age}"
            },
            {
              "icon": "",
              "label": "Ana is 30"
            },
            {
              "icon": "",
              "label": "name is age"
            },
            {
              "icon": "",
              "label": "引發 TypeError"
            }
          ]
        },
        {
          "question": "1 < 2 < 3 計算為什麼？",
          "options": [
            {
              "icon": "",
              "label": "True"
            },
            {
              "icon": "",
              "label": "False"
            },
            {
              "icon": "",
              "label": "引發 SyntaxError"
            },
            {
              "icon": "",
              "label": "3"
            }
          ]
        },
        {
          "question": "bool([]) 返回什麼，bool([0]) 返回什麼？",
          "options": [
            {
              "icon": "",
              "label": "False 然後 False"
            },
            {
              "icon": "",
              "label": "False 然後 True"
            },
            {
              "icon": "",
              "label": "True 然後 True"
            },
            {
              "icon": "",
              "label": "True 然後 False"
            }
          ]
        },
        {
          "question": "有一個模組級 count = 0。在 def increment(): count += 1; return count 內，你呼叫 increment()。會發生什麼？",
          "options": [
            {
              "icon": "",
              "label": "引發 UnboundLocalError"
            },
            {
              "icon": "",
              "label": "返回 1，並把全域性的 count 設為 1"
            },
            {
              "icon": "",
              "label": "返回 1，但全域性 count 仍然是 0"
            },
            {
              "icon": "",
              "label": "引發 TypeError"
            }
          ]
        },
        {
          "question": "def f(*args, **kwargs): return args, kwargs。f(1, 2, x=3) 返回什麼？",
          "options": [
            {
              "icon": "",
              "label": "([1, 2], {'x': 3})"
            },
            {
              "icon": "",
              "label": "((1, 2), {'x': 3})"
            },
            {
              "icon": "",
              "label": "(1, 2, {'x': 3})"
            },
            {
              "icon": "",
              "label": "引發 TypeError"
            }
          ]
        },
        {
          "question": "你用一個迴圈構建 funcs = [lambda: i for i in range(3)]。[f() for f in funcs] 返回什麼？",
          "options": [
            {
              "icon": "",
              "label": "[2, 2, 2]"
            },
            {
              "icon": "",
              "label": "[0, 1, 2]"
            },
            {
              "icon": "",
              "label": "[0, 0, 0]"
            },
            {
              "icon": "",
              "label": "引發 NameError"
            }
          ]
        },
        {
          "question": "一個函式定義上方有 @a，@b 直接在它上方，def f(): pass 在 @b 下面。裝飾器按什麼順序應用到 f？",
          "options": [
            {
              "icon": "",
              "label": "先由 b 包裝 f，再由 a 包裝結果"
            },
            {
              "icon": "",
              "label": "先由 a 包裝 f，再由 b 包裝結果"
            },
            {
              "icon": "",
              "label": "只有最後定義的那個生效"
            },
            {
              "icon": "",
              "label": "取決於匯入順序"
            }
          ]
        },
        {
          "question": "def f(a, *, b): return a + b。這些呼叫中哪個工作？",
          "options": [
            {
              "icon": "",
              "label": "f(1, b=2)"
            },
            {
              "icon": "",
              "label": "f(1, 2)"
            },
            {
              "icon": "",
              "label": "f(a=1, 2)"
            },
            {
              "icon": "",
              "label": "f(1)"
            }
          ]
        },
        {
          "question": "一個生成器函式 yield 1，然後 yield 2，然後 return 99。list(the_generator()) 包含什麼，99 怎麼處理？",
          "options": [
            {
              "icon": "",
              "label": "[1, 2, 99]，因為 return 相當於最後一次 yield"
            },
            {
              "icon": "",
              "label": "[99]，因為 return 會覆蓋所有 yield"
            },
            {
              "icon": "",
              "label": "[1, 2]，而 99 成為 StopIteration 的值"
            },
            {
              "icon": "",
              "label": "引發 RuntimeError"
            }
          ]
        },
        {
          "question": "在 outer() 函式內，x = 1 被設定，然後巢狀的 inner() 做 nonlocal x; x += 1，outer() 在返回 x 前呼叫 inner()。outer() 返回什麼？",
          "options": [
            {
              "icon": "",
              "label": "1"
            },
            {
              "icon": "",
              "label": "引發 UnboundLocalError"
            },
            {
              "icon": "",
              "label": "引發 SyntaxError"
            },
            {
              "icon": "",
              "label": "2"
            }
          ]
        },
        {
          "question": "d = {'a': 1, 'b': 2}。d.get('c', 0) 返回什麼，它會把 'c' 加到字典嗎？",
          "options": [
            {
              "icon": "",
              "label": "返回 0，不會新增"
            },
            {
              "icon": "",
              "label": "返回 0，會新增"
            },
            {
              "icon": "",
              "label": "引發 KeyError"
            },
            {
              "icon": "",
              "label": "返回 None，會新增"
            }
          ]
        },
        {
          "question": "t = (1, 2, [3, 4])。你能執行 t[2].append(5) 嗎，你能執行 t[0] = 10 嗎？",
          "options": [
            {
              "icon": "",
              "label": "兩個都能執行"
            },
            {
              "icon": "",
              "label": "兩個都引發 TypeError"
            },
            {
              "icon": "",
              "label": "t[2].append(5) 引發 TypeError，t[0] = 10 能執行"
            },
            {
              "icon": "",
              "label": "t[2].append(5) 能執行，t[0] = 10 引發 TypeError"
            }
          ]
        },
        {
          "question": "這兩個中哪個返回一個惰性計算值的迭代器而不是把整個序列構建到記憶體中：[x*x for x in range(1000000)] 還是 (x*x for x in range(1000000))？",
          "options": [
            {
              "icon": "",
              "label": "用圓括號的那個"
            },
            {
              "icon": "",
              "label": "用方括號的那個"
            },
            {
              "icon": "",
              "label": "兩者都是，只是結果型別不同"
            },
            {
              "icon": "",
              "label": "都不是，兩者都會構建完整列表"
            }
          ]
        },
        {
          "question": "一個 try 塊除以零，except ZeroDivisionError 子句列印 'a'，finally 子句列印 'b'。列印什麼和什麼順序？",
          "options": [
            {
              "icon": "",
              "label": "b 然後 a"
            },
            {
              "icon": "",
              "label": "a 然後 b"
            },
            {
              "icon": "",
              "label": "只有 b"
            },
            {
              "icon": "",
              "label": "只有 a"
            }
          ]
        },
        {
          "question": "import copy; a = [[1, 2], [3, 4]]; b = copy.copy(a); b[0].append(99)。a[0] 也變了嗎？",
          "options": [
            {
              "icon": "",
              "label": "沒變"
            },
            {
              "icon": "",
              "label": "引發錯誤"
            },
            {
              "icon": "",
              "label": "僅在使用 deepcopy 時"
            },
            {
              "icon": "",
              "label": "變了"
            }
          ]
        },
        {
          "question": "d = {'x': 1, 'y': 2}。'x' in d 檢查什麼 — 鍵、值還是都檢查？",
          "options": [
            {
              "icon": "",
              "label": "字典的值"
            },
            {
              "icon": "",
              "label": "鍵和值都檢查"
            },
            {
              "icon": "",
              "label": "都不檢查，會引發 TypeError"
            },
            {
              "icon": "",
              "label": "字典的鍵"
            }
          ]
        },
        {
          "question": "names = ['Al', 'Bo'] 和 scores = [10, 20]。list(zip(names, scores)) 返回什麼？",
          "options": [
            {
              "icon": "",
              "label": "[('Al', 'Bo'), (10, 20)]"
            },
            {
              "icon": "",
              "label": "['Al', 10, 'Bo', 20]"
            },
            {
              "icon": "",
              "label": "[('Al', 10), ('Bo', 20)]"
            },
            {
              "icon": "",
              "label": "引發 ValueError"
            }
          ]
        },
        {
          "question": "class Dog: tricks = [] 有一個類級列表，add_trick append 到 self.tricks。d1 = Dog() 和 d2 = Dog() 都被建立，然後 d1.add_trick('sit') 執行。d2.tricks 包含什麼？",
          "options": [
            {
              "icon": "",
              "label": "[]"
            },
            {
              "icon": "",
              "label": "['sit']"
            },
            {
              "icon": "",
              "label": "引發 TypeError"
            },
            {
              "icon": "",
              "label": "None"
            }
          ]
        },
        {
          "question": "class A 有 def greet(self): return 'A'。class B(A) 有 def greet(self): return 'B' + super().greet()。B().greet() 返回什麼？",
          "options": [
            {
              "icon": "",
              "label": "'AB'"
            },
            {
              "icon": "",
              "label": "'B'"
            },
            {
              "icon": "",
              "label": "'BA'"
            },
            {
              "icon": "",
              "label": "引發 AttributeError"
            }
          ]
        },
        {
          "question": "class Point 在 __init__ 中儲存 self.x，不定義其他方法。p1 = Point(1) 和 p2 = Point(1)。預設情況下 p1 == p2 返回什麼？",
          "options": [
            {
              "icon": "",
              "label": "True"
            },
            {
              "icon": "",
              "label": "False"
            },
            {
              "icon": "",
              "label": "None"
            },
            {
              "icon": "",
              "label": "引發 TypeError"
            }
          ]
        },
        {
          "question": "下面哪個 except 子句也會捕獲 ZeroDivisionError：except ArithmeticError、except ValueError 還是 except KeyError？",
          "options": [
            {
              "icon": "",
              "label": "except ValueError"
            },
            {
              "icon": "",
              "label": "except KeyError"
            },
            {
              "icon": "",
              "label": "一個都不能"
            },
            {
              "icon": "",
              "label": "except ArithmeticError"
            }
          ]
        },
        {
          "question": "你用 open('data.txt') as f: 開啟檔案，塊內讀取時引發異常。檔案還是會關閉嗎？",
          "options": [
            {
              "icon": "",
              "label": "不會"
            },
            {
              "icon": "",
              "label": "只有另加 finally 子句時才會"
            },
            {
              "icon": "",
              "label": "會的"
            },
            {
              "icon": "",
              "label": "取決於異常型別"
            }
          ]
        },
        {
          "question": "x = [3, 1, 2] 和 y = x.sort()。y 包含什麼？",
          "options": [
            {
              "icon": "",
              "label": "[1, 2, 3]"
            },
            {
              "icon": "",
              "label": "None"
            },
            {
              "icon": "",
              "label": "[3, 1, 2]"
            },
            {
              "icon": "",
              "label": "引發 TypeError"
            }
          ]
        },
        {
          "question": "當你執行 'Score: ' + 42 時會發生什麼？",
          "options": [
            {
              "icon": "",
              "label": "'Score: 42'"
            },
            {
              "icon": "",
              "label": "'Score: '"
            },
            {
              "icon": "",
              "label": "42"
            },
            {
              "icon": "",
              "label": "引發 TypeError"
            }
          ]
        },
        {
          "question": "你需要檢查一個叫 results 的列表是否為空。地道的 Python 方式是什麼：if results == []: 、if len(results) == 0: 還是 if not results: ？",
          "options": [
            {
              "icon": "",
              "label": "if results == []:"
            },
            {
              "icon": "",
              "label": "if len(results) == 0:"
            },
            {
              "icon": "",
              "label": "if results is None:"
            },
            {
              "icon": "",
              "label": "if not results:"
            }
          ]
        }
      ],
      "optionOrderVersion": "26e0df963ab76db1"
    }
  },
  "testNames": {
    "python-test": "Python 技能"
  }
}
