進階特性 · 10 道範例題

Python 列表推導式練習題與答案

推導式把迴圈、表達式和篩選壓進一行。語法很緊湊,但初學者真正需要慢下來讀的,是 for 和 if 子句的順序。

40 道題在完整題庫中 · 13 道選擇 · 11 道填空 · 16 道輸出

這個主題考什麼

  • 從左到右讀推導式,先找出輸出表達式。
  • 添加篩選條件,同時不改變結果的結構。
  • 判斷推導式是否已經密集到難以維護。

常見錯誤

  • 把 if 篩選放在 for 前面,正確位置通常在後面。
  • 試圖在一個推導式裡做多個不相關的副作用。
  • 不追蹤順序,就假設巢狀推導式和巢狀迴圈完全一樣。
範例題

範例題

10

從完整題庫中挑出的 10 道代表題。先自己作答,再展開答案。

  1. 選擇題q1251

    1. 小明用推導式算奶茶銷量平方 [x**2 for x in range(5) if x%2==0](只算偶數天),結果是?

    1. [0,1,4,9,16]
    2. [0,4,16]
    3. [0,4]
    4. [1,9]
    顯示答案

    答案

    B. [0,4,16]

    解析: if 先於表達式執行,只有 0、2、4 會進入 x**2,結果是 [0, 4, 16]。先過濾,1、3 和 9 才不會出現。

  2. 選擇題q1259

    2. 判斷對錯: 生成器是惰性求值的, 不會一次性算出所有元素。

    1. ✅ 正確
    2. ❌ 錯誤
    顯示答案

    答案

    A. ✅ 正確

    解析: 生成器只在被請求時計算下一個元素,所以百萬行檔案也能用固定記憶體處理完,不必先建串列,這就是惰性,按需取用。

  3. 選擇題q1263

    3. 🧋 小明用字典推導式生成奶茶價格表,{k: v for k, v in [('a',1),('b',2)]} 的結果?

    1. {'a':1,'b':2}
    2. ['a',1,'b',2]
    3. [('a',1),('b',2)]
    4. {'a','b'}
    顯示答案

    答案

    A. {'a':1,'b':2}

    解析: 每個元組解包成 k、v,推導式把它們存成鍵值對,得到 {'a': 1, 'b': 2}。鍵重複時後一個覆蓋前一個,但位置仍按首次出現算。

  4. 選擇題q1280

    4. 從訂單串列裡只取金額大於 20 的訂單,最簡潔的寫法是?

    1. [o if o['price'] > 20]
    2. for o in orders > 20
    3. {o for o in orders}
    4. [o for o in orders if o['price'] > 20]
    顯示答案

    答案

    D. [o for o in orders if o['price'] > 20]

    解析: 過濾條件要放在 for 之後,而不是表達式裡:[o for o in orders if o['price'] > 20]。過濾必須寫在定義 o 的子句之後;寫在前面時 o 還不存在。

  5. 填空題q1262

    5. 🧋 小明用推導式生成奶茶銷量資料,串列推導式語法:[表達式 for 變數 in 可迭代物件 if ___]

    顯示答案

    答案

    條件

    解析: 末尾的 if 是可選項,接收布林表達式,只有結果為真的元素才會被收集。把條件寫在 for 之前是語法錯誤,不會得到空串列。

  6. 填空題q1275

    6. 只保留偶數的平方,橫線填什麼關鍵字?

    squares = [x * x for x in range(6) ____ x % 2 == 0]
    顯示答案

    答案

    if

    解析: 末尾的 if 起過濾作用:x % 2 == 0 留下 0、2、4,在平方之前就把奇數去掉。把條件塞進表達式(x*x if ...)就必須補寫 else 分支。

  7. 填空題q1279

    7. 把兩個串列按位置配對,橫線填什麼函式?

    pairs = [(a, b) for a, b in ____(names, prices)]
    顯示答案

    答案

    zip

    解析: zip(names, prices) 按位置配對,長度不同時以較短者為準,因此不會出現 IndexError。zip_longest 會繼續配對,缺失的一側填 None。

  8. 輸出預測q1252

    8. 小明用推導式算平方,下面程式碼會列印什麼?

    print([x*x for x in range(4)])
    顯示答案

    答案

    [0, 1, 4, 9]

    解析: range(4) 產出 0、1、2、3,表達式逐個平方,得到 [0, 1, 4, 9]。map 加 lambda 也能做到,但推導式更直接地表達意圖。

  9. 輸出預測q1266

    9. 遊戲只把串列中的偶數值翻倍。會列印什麼?

    nums = [1, 2, 3, 4]
    print([n * 2 for n in nums if n % 2 == 0])
    顯示答案

    答案

    [4, 8]

    解析: 過濾條件留下偶數 2 和 4,表達式把它們翻倍成 4 和 8;奇數根本不會進入表達式,這就是先篩後算,篩子在前。

  10. 輸出預測q1271

    10. 從三個數中取兩個的組合,結果是什麼?

    from itertools import combinations
    print(list(combinations([1, 2, 3], 2)))
    顯示答案

    答案

    [(1, 2), (1, 3), (2, 3)]

    解析: combinations(..., 2) 取兩個元素且不計順序,所以 (1,2) 只出現一次,(2,1) 不會出現。

常見問題

什麼時候不該用推導式?

需要多條語句、複雜錯誤處理或副作用時,普通迴圈更容易讀和偵錯。

推導式可以回傳生成器嗎?

生成器表達式使用圓括號而不是方括號,會惰性產生值。

繼續保持練習節奏。

完整題庫會在這個瀏覽器裡記住進度,支援依主題篩選,並包含每日一題和錯題重練。

開啟完整練習