Module 10 — ทบทวน (Review)

List Comprehension — แบบฝึกทบทวน

ทบทวน Module 10 📝

  • Multiple Choice — เลือกคำตอบที่ถูก แล้วกดถัดไปเพื่อดูเฉลย
  • ทำนายผล · ไล่ค่าตัวแปร · หา Bug
  • เติมคำในช่องว่าง — ลองพิมพ์ใน Live Code แล้วรัน

. . .

Note

ครอบคลุม: สร้าง list ด้วย loop · list comprehension · เงื่อนไข if · ร่วมกับฟังก์ชัน · 2D list ทบทวนเนื้อหาเต็มได้ที่ Module 10 👈

Multiple Choice 🔘

เลือกคำตอบที่ถูกต้อง — เฉลยจะปรากฏเมื่อกดถัดไป

คำถาม #1

List comprehension ประกอบด้วยส่วนใดบ้าง?

A. ทำซ้ำ + ประมวลผล + เงื่อนไข(optional)
B. import + run + print
C. def + return

Tip

ตอบ: A[exprfor x in dataif cond] = ประมวลผล + ทำซ้ำ + เงื่อนไข

คำถาม #2

[2*i for i in range(5)] ให้ผลลัพธ์ใด?

A. [0, 2, 4, 6, 8]
B. [2, 4, 6, 8, 10]
C. [0, 1, 2, 3, 4]

Tip

ตอบ: Ai = 0,1,2,3,4 → 2*i = [0, 2, 4, 6, 8]

คำถาม #3: ชวนคิด

ต้องการเก็บเฉพาะค่าที่ตรงเงื่อนไข — ต้องวาง if ไว้ตรงไหน?

A. ก่อน for
B. ท้าย for-loop เช่น [x for x in data if x>5]
C. ไว้นอกวงเล็บ

Tip

ตอบ: B — เพิ่ม if condition ไว้ด้านท้าย → เก็บผลลัพธ์เฉพาะรอบที่เงื่อนไขเป็นจริง

คำถาม #4

การสร้าง list ด้วย loop เริ่มจากอะไร?

A. list ที่มีข้อมูลครบ
B. empty list [] แล้ว .append() ในลูป
C. ตัวแปรตัวเลข

Tip

ตอบ: Ba = [] แล้ววน a.append(...) เพิ่ม item ทีละตัว

คำถาม #5

2D list คืออะไร?

A. list ที่มีตัวเลข 2 ตัว
B. list ที่มี item เป็น list อีกชั้น (list of lists)
C. list 2 ตัวแปร

Tip

ตอบ: B — เช่น [[0,1,2],[3,4,5]] · อ้างอิงด้วย a[row][col]

คำถาม #6: ชวนคิด

a = [[0,1,2],[3,4,5],[6,7,8]]a[1][2] มีค่าเท่าใด?

A. 2
B. 5
C. 7

Important

ตอบ: Ba[1] = [3,4,5] (row 1) แล้ว [2] = 5 (column 2)

ทำนายผล 🔮

โค้ดจะพิมพ์อะไร? — ทายก่อน แล้วกดถัดไปดูเฉลย

ทำนายผล #7

a = [i*i for i in range(5)]
print(a)

Tip

ผลลัพธ์: [0, 1, 4, 9, 16]i = 0..4 → กำลังสองของแต่ละตัว

ทำนายผล #8: ชวนคิด

xs = [3, 8, 1, 10, 5]
r = [x for x in xs if x > 5]
print(r)

Important

ผลลัพธ์: [8, 10] — เก็บเฉพาะค่าที่ > 5 (3, 1, 5 ถูกกรองทิ้ง)

ทำนายผล #9: ชวนคิด

b = [[0]*3 for i in range(2)]
print(b)

Tip

ผลลัพธ์: [[0, 0, 0], [0, 0, 0]] — 2 row (range(2)) แต่ละ row คือ [0]*3 = 3 ช่อง

ไล่ค่าตัวแปร 🔍

ไล่ค่า list ทีละรอบของลูป

ไล่ค่าตัวแปร #10: ชวนคิด

a = []
for i in range(4):
    a.append(2*i)

ค่าของ a หลังแต่ละรอบเป็นอย่างไร?

รอบ (i) a.append(?) a
0 0 ?
1 2 ?
2 4 ?
3 6 ?

Tip

รอบ (i) a
0 [0]
1 [0, 2]
2 [0, 2, 4]
3 [0, 2, 4, 6]

เทียบเท่ากับ [2*i for i in range(4)]

หา Bug 🐞

โค้ดผิดตรงไหน — ทำไม

หา Bug #11

a = [2*i for i in range(5)
print(a)

ผิดตรงไหน?

Important

ผิด: ลืมปิด ] ของ list comprehension → SyntaxError แก้: a = [2*i for i in range(5)]

หา Bug #12: ชวนคิด

# อยากได้เฉพาะเลขคู่ใน [0..9]
r = [x if x % 2 == 0 for x in range(10)]
print(r)

ผิดตรงไหน?

Important

ผิด: วาง if ผิดที่ — เมื่อใช้กรอง ต้องไว้ท้าย for แก้: r = [x for x in range(10) if x % 2 == 0][0, 2, 4, 6, 8]

เติมคำในช่องว่าง ✏️

เติมโค้ดในช่อง ____ แล้วกด Run

เติมคำ #13

เติมโค้ดสร้าง [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] ด้วย list comprehension

a = [ 2*i for i in range(10) ]
print(a)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

เติมคำ #14

จาก xs เก็บ \(x^2\) เฉพาะเมื่อ x > 5 (list comprehension)

xs = [3, 8, 1, 10, 5, 7]
fx = [ x**2 for x in xs if x > 5 ]
print(fx)
[64, 100, 49]

เติมคำ #15: ชวนคิด

เติมโค้ดสร้าง 2D-list ขนาด 3 row × 4 column สมาชิกเป็น 0 ทั้งหมด

n = 3; m = 4
b = [ [0]*m for i in range(n) ]
print(b)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

เจาะจุดยาก: แปลง Loop ↔︎ Comprehension 🎯

ฝึกเพิ่ม — อ่านและเขียน comprehension ให้คล่อง

ทำนายผล #16: ชวนคิด

a = [x*x for x in range(1, 4)]
b = [x for x in range(6) if x % 2 == 1]
print(a)
print(b)

Tip

ผลลัพธ์:

[1, 4, 9]
[1, 3, 5]

a = กำลังสองของ 1,2,3 · b = เก็บเฉพาะเลขคี่ใน 0–5

เติมคำ #17: ชวนคิด

แปลง for-loop ให้เป็น list comprehension

r = [ x * 10 for x in range(5) ]
print(r)
[0, 10, 20, 30, 40]

ทำนายผล #18: ชวนคิด

b = [[j for j in range(3)] for i in range(2)]
print(b)

Important

ผลลัพธ์: [[0, 1, 2], [0, 1, 2]] — comp ซ้อน 2 ชั้น: ชั้นนอกสร้าง 2 row (i) · ชั้นในสร้าง [0,1,2] (j)

Engineering Application 🔧

แปลง/ประมวลผลข้อมูลการวัดด้วย list comprehension

Engineering #19: แปลงหน่วยอุณหภูมิ

c = [0, 25, 100]
f = [t * 9/5 + 32 for t in c]
print(f)

Tip

ผลลัพธ์: [32.0, 77.0, 212.0] — แปลง °C → °F ทุก item ด้วยสูตร \(F = \tfrac95 C + 32\)

Engineering #20

เติมโค้ดขยายสัญญาณ ทุกค่าเป็น 2 เท่า (list comprehension)

signal = [1, 2, 3, 4]
amplified = [ s * 2 for s in signal ]
print(amplified)
[2, 4, 6, 8]

Engineering #21: คัดค่าที่เกินเกณฑ์

readings = [12, 55, 48, 70, 33]
over = [r for r in readings if r > 50]
print(over)

Tip

ผลลัพธ์: [55, 70] — list comprehension + เงื่อนไข เก็บเฉพาะค่าที่เกินเกณฑ์ 50

ท้าทาย 🔥

trap ของ 2D list + numerical method

ท้าทาย #22: [[0]*3]*2 ทำไมพัง

grid = [[0] * 3] * 2
grid[0][0] = 5
print(grid)

grid เป็นอะไร? (ระวัง!)

Important

ผลลัพธ์: [[5, 0, 0], [5, 0, 0]]*2 คัดลอก reference เดียวกัน ทั้ง 2 แถวชี้ list เดียว → แก้แถวเดียวเปลี่ยนทั้งคู่ แก้: ใช้ comprehension [[0]*3 for i in range(2)] (สร้าง list ใหม่ทุกแถว)

ท้าทาย #23: อินทิเกรตด้วยสี่เหลี่ยมคางหมู

หาพื้นที่ใต้กราฟ \(y=x^2\) ช่วง [0, 2] — เติมสูตรพื้นที่คางหมู \(\tfrac{y_i + y_{i+1}}{2} \times \Delta x\)

xs = [i * 0.5 for i in range(5)]
ys = [x**2 for x in xs]
area = 0
for i in range(len(xs) - 1):
    area += (ys[i] + ys[i+1]) / 2 * (xs[i+1] - xs[i])
print(area)
2.75

Note

ค่าจริง \(\int_0^2 x^2\,dx = 2.667\) — คางหมูให้ค่าประมาณ 2.75 (ยิ่งแบ่งถี่ยิ่งแม่น)

จบการทบทวน 🎉

ทบทวนเนื้อหาเต็มได้ที่ Module 10 · ไปต่อ Module 11