Module 9 — ทบทวน (Review)

Functions — แบบฝึกทบทวน

ทบทวน Module 9 📝

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

. . .

Note

ครอบคลุม: def · parameter/return · นิยามก่อนเรียก · คืนหลายค่า · return หลายแห่ง · Scope (local/global) ทบทวนเนื้อหาเต็มได้ที่ Module 9 👈

Multiple Choice 🔘

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

คำถาม #1

คีย์เวิร์ดใดใช้นิยามฟังก์ชัน ใน Python?

A. func
B. def
C. function
D. define

Tip

ตอบ: Bdef function_name(parameters): แล้วย่อหน้าเขียนโค้ดของฟังก์ชัน

คำถาม #2

คำสั่ง return ทำหน้าที่อะไร?

A. พิมพ์ค่าออกจอ
B. ส่งค่าผลลัพธ์คืนให้โค้ดที่เรียกใช้
C. รับค่าจากผู้ใช้

Tip

ตอบ: Breturn = เอาต์พุต ของฟังก์ชัน ส่งค่ากลับไปยังจุดที่เรียก (ต่างจาก print ที่แค่แสดงผล)

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

ใน def f(x, y):x และ y คืออะไร?

A. ผลลัพธ์
B. พารามิเตอร์ (อินพุต) ของฟังก์ชัน
C. ตัวแปร global

Tip

ตอบ: Bparameter_list คือข้อมูลที่ต้องส่งให้ฟังก์ชัน (อินพุต) และเป็นตัวแปร local

คำถาม #4

ในไฟล์โปรแกรม การนิยามฟังก์ชันต้องอยู่ตรงไหนเทียบกับการเรียกใช้?

A. ที่ไหนก็ได้
B. ก่อนบรรทัดที่เรียกใช้เสมอ
C. หลังบรรทัดที่เรียกใช้

Important

ตอบ: B — ต้องนิยามก่อนบรรทัดที่เรียก (หลักการเดียวกับประกาศตัวแปรก่อนใช้)

คำถาม #5

ฟังก์ชันคืนค่า 2 ค่าได้อย่างไร? return sm, avg

A. คืนได้ค่าเดียวเท่านั้น
B. return sm, avg แล้วรับด้วย s, a = f(...)
C. ต้องเขียน 2 ฟังก์ชัน

Tip

ตอบ: Breturn sm, avg คืนได้หลายค่า รับพร้อมกันด้วย s, a = mySumAvg(...)

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

ตัวแปร local (ประกาศในฟังก์ชัน) เรียกใช้ได้ที่ไหน?

A. ทุกที่ในโปรแกรม
B. เฉพาะภายในฟังก์ชันที่สร้างมัน
C. เฉพาะหลังฟังก์ชัน

Important

ตอบ: B — local ใช้ได้เฉพาะในขอบเขตที่สร้าง และถูกทำลายเมื่อฟังก์ชันจบ — เรียกใช้นอกฟังก์ชัน → NameError

คำถาม #7

ฟังก์ชันที่มี return หลายแห่ง จะจบการทำงานเมื่อใด?

A. รันครบทุก return
B. จบทันทีที่พบ return ตัวแรกที่ทำงานถึง
C. จบที่บรรทัดสุดท้ายเสมอ

Tip

ตอบ: B — พบ return เมื่อไร ฟังก์ชันจบและส่งค่าคืนทันที บรรทัดที่เหลือไม่ถูกรัน

ทำนายผล 🔮

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

ทำนายผล #8

def add_tax(price):
    return price * 1.07

total = add_tax(100)
print(total)

Tip

ผลลัพธ์: 107.0100 * 1.07 = 107.0 (ค่าที่ return ถูกเก็บใน total แล้ว print)

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

def area(w, h):
    return w * h

def total(a, b):
    return a + b

print(total(area(2, 3), area(4, 5)))

Important

ผลลัพธ์: 26area(2,3)=6, area(4,5)=20 → ค่าที่ return ถูกส่งเข้า total(6, 20) = 26 (ฟังก์ชันเรียกใช้ฟังก์ชันอื่นได้)

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

def myGrade(score):
    if score >= 80: return 'A'
    elif score >= 50: return 'B'
    else: return 'F'

print(myGrade(95), myGrade(50), myGrade(20))

Tip

ผลลัพธ์: A B F — แต่ละครั้งฟังก์ชันจบทันทีที่พบ return ที่เงื่อนไขเป็นจริงเป็นครั้งแรก

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

global กับ local — ตัวไหนเปลี่ยน ตัวไหนไม่เปลี่ยน

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

x = 10
def f():
    x = 3          # local x
    print("in f:", x)

print(x)
f()
print(x)

พิมพ์อะไร 3 บรรทัด?

Important

ผลลัพธ์:

10
in f: 3
10

x ในฟังก์ชันเป็น local (คนละตัวกับ global x) → global x ยังเป็น 10 เหมือนเดิม

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

x = 10
def f(x):
    x = x + 3
    return x * 2

print(x)
x = f(x)           # อัปเดต global x
print(x)

Tip

ผลลัพธ์:

10
26

ในฟังก์ชัน x = 10+3 = 13 → คืน 26 · global x เปลี่ยนตอน x = f(x) นอกฟังก์ชัน → 26

หา Bug 🐞

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

หา Bug #13

print(area(5))

def area(r):
    return 3.14 * r * r

ผิดตรงไหน?

Important

ผิด: เรียกใช้ area() ก่อนนิยาม → NameError (ยังไม่รู้จักฟังก์ชัน) แก้: ย้าย def area(r): ... ขึ้นไปก่อนบรรทัดที่เรียกใช้

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

def square(n):
    result = n * n

square(4)
print(result)      # อยากพิมพ์ 16

ได้ error — ผิดตรงไหน?

Important

ผิด: result เป็นตัวแปร local ของ square → เรียกใช้นอกฟังก์ชันไม่ได้ (NameError) แก้: ให้ฟังก์ชัน return result แล้วรับค่าไว้ใช้ เช่น x = square(4)

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

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

เติมคำ #15

เติมโค้ดนิยามฟังก์ชัน area_circle ที่รับ r แล้วคืนค่า พื้นที่ (\(3.14 r^2\))

def area_circle(r):
    return 3.14 * r * r

print(area_circle(7))
153.86

เติมคำ #16

เติมโค้ดให้ฟังก์ชันคืน 2 ค่า (ผลรวมและค่าเฉลี่ย) แล้วรับพร้อมกัน

def sum_avg(x, y, z):
    sm = x + y + z
    avg = sm / 3
    return sm, avg

s, a = sum_avg(10, 20, 30)
print(f'sum:{s:.2f}, avg:{a:.2f}')
sum:60.00, avg:20.00

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

เติมโค้ดให้ myGrade คืนเกรดตามเงื่อนไข (>=80→A, >=50→B, นอกนั้น→F)

def myGrade(score):
    if score >= 80: return 'A'
    elif score >= 50: return 'B'
    else: return 'F'

for s in [95, 60, 30]:
    print(s, myGrade(s))
95 A
60 B
30 F

Note

ทบทวน: if-elif-else (Module 5)

เจาะจุดยาก: Scope 🎯

ฝึกเพิ่ม — local vs global คือจุดที่พลาดบ่อยสุด

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

def add_one(n):
    n = n + 1
    return n

num = 5
add_one(num)          # ไม่ได้เก็บค่าที่คืน
print(num)

num เป็นเท่าไร?

Important

ผลลัพธ์: 5n เป็น local ของฟังก์ชัน การเพิ่มค่าเกิดกับ n ไม่ใช่ num · แถมไม่ได้เก็บค่าที่ returnnum คงเดิม (ถ้าอยากเปลี่ยนต้อง num = add_one(num))

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

count = 0
def tick():
    count = 10        # local (ชื่อซ้ำ global)
    print("in:", count)

tick()
print("out:", count)

Tip

ผลลัพธ์:

in: 10
out: 0

count ในฟังก์ชันเป็น local คนละตัว กับ global count → global ยังเป็น 0

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

def f():
    a = 5
    return a * 2

def g():
    return a          # อยากใช้ a จาก f()

print(f())
print(g())

ผิดตรงไหน?

Important

ผิด: a เป็น local ของ f → ใน g ไม่รู้จัก → NameError แก้: ส่งค่าเข้าไปเป็น parameter เช่น def g(a): return a

Engineering Application 🔧

ห่อสูตรวิศวกรรมเป็นฟังก์ชันเรียกใช้ซ้ำ

Engineering #21

เติมฟังก์ชันพลังงานจลน์ \(E_k = \tfrac12 m v^2\)

def kinetic_energy(m, v):
    return 0.5 * m * v ** 2

print(kinetic_energy(2, 3))
9.0

Engineering #22: โมเมนต์

def moment(force, dist):
    return force * dist

print(moment(50, 2) + moment(30, 4))

Tip

ผลลัพธ์: 220 — โมเมนต์ \(M = F \times d\) · เรียกฟังก์ชันเดิมซ้ำ 2 จุด (แรง 50 ที่ 2 m + แรง 30 ที่ 4 m)

Engineering #23: พื้นที่หน้าตัดท่อ

เติมโค้ดฟังก์ชันหาพื้นที่วงกลม \(A = \pi r^2\) (ใช้ \(\pi \approx 3.14\))

def circle_area(r):
    return 3.14 * r ** 2

print(circle_area(2))
12.56

ท้าทาย 🔥

เขียนฟังก์ชันที่มี algorithm อยู่ข้างใน

ท้าทาย #24: หา √ ด้วย Newton’s method

เติมสูตรวนซ้ำ \(x \leftarrow \dfrac{x + a/x}{2}\) (ลู่เข้าหา \(\sqrt{a}\))

def my_sqrt(a):
    x = a
    for i in range(20):
        x = (x + a/x) / 2
    return x

print(f'{my_sqrt(2):.6f}')
1.414214

ท้าทาย #25: หา min และ max เอง

def minmax(data):
    lo = hi = data[0]
    for x in data:
        if x < lo: lo = x
        if x > hi: hi = x
    return lo, hi

print(minmax([3, 9, 1, 7]))

Important

ผลลัพธ์: (1, 9) — ไล่ทุกค่า อัปเดต lo/hi เอง (ไม่ใช้ min/max) แล้ว คืน 2 ค่า

จบการทบทวน 🎉

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