Notes & software courses · Free to learn
Aph's Blog
On this page

ฟังก์ชัน (Functions)

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

จัดกลุ่มคำสั่งให้เป็นชุดที่เรียกใช้ซ้ำได้ — parameter, return, ค่า default, *args/**kwargs และ lambda

ฟังก์ชันคือการรวมคำสั่งหลายบรรทัดเป็นชุดที่ตั้งชื่อไว้ เรียกใช้กี่ครั้งก็ได้ ทำให้โค้ดสั้น ไม่ซ้ำซ้อน และแก้ที่เดียวพอ ถือเป็นทักษะที่ยกระดับโค้ดของคุณจาก "สคริปต์" เป็น "โปรแกรม" จริง ๆ

นิยามและเรียกใช้ฟังก์ชัน

python
def greet():                 # def = define นิยามฟังก์ชัน
    print("สวัสดีครับ")
    print("ยินดีต้อนรับ")

greet()                      # เรียกใช้ (อย่าลืมวงเล็บ)
greet()                      # เรียกซ้ำได้เรื่อย ๆ
สังเกตวงเล็บ

greet หมายถึงตัวฟังก์ชันเอง ส่วน greet() (มีวงเล็บ) คือการสั่งให้ "ทำงาน" ลืมวงเล็บคือบั๊กที่เจอบ่อย โปรแกรมจะไม่รันฟังก์ชันให้

parameter — รับค่าเข้า

parameter คือตัวแปรที่ฟังก์ชันรับเข้ามาทำงาน ทำให้ฟังก์ชันยืดหยุ่น ใช้กับข้อมูลต่างกันได้

python
def greet(name):             # name คือ parameter
    print(f"สวัสดี {name}")

greet("Aphisit")             # สวัสดี Aphisit  ("Aphisit" คือ argument)
greet("Mali")                # สวัสดี Mali

def add(a, b):               # รับได้หลายตัว
    print(a + b)
add(3, 5)                    # 8
parameter vs argument

parameter คือชื่อตัวแปรตอน "นิยาม" ฟังก์ชัน (name) ส่วน argument คือค่าจริงที่ส่งตอน "เรียกใช้" ("Aphisit") คนมักเรียกรวม ๆ ว่า "พารามิเตอร์" ก็เข้าใจกันได้

return — ส่งค่ากลับ

ความแตกต่างสำคัญ: print แค่ "แสดง" ออกจอ แต่ return "ส่งค่ากลับ" ให้นำไปใช้ต่อได้ ฟังก์ชันที่คำนวณควรใช้ return เพื่อให้นำผลไปคิดต่อ

python
def add(a, b):
    return a + b             # ส่งผลลัพธ์กลับ จบฟังก์ชันทันที

result = add(3, 5)           # เก็บค่าที่ส่งกลับ
print(result)                # 8
print(add(10, 20) * 2)       # 60  (นำผลไปคำนวณต่อได้)

# return หลายค่าได้ (ได้เป็น tuple)
def min_max(nums):
    return min(nums), max(nums)
low, high = min_max([3, 1, 7])
print(low, high)             # 1 7
print vs return ต่างกันอย่างไร (กดดูตัวอย่าง)
python
def add_print(a, b):
    print(a + b)      # แค่แสดง

def add_return(a, b):
    return a + b      # ส่งค่ากลับ

x = add_print(2, 3)   # แสดง 5 บนจอ แต่ x = None
y = add_return(2, 3)  # ไม่แสดงอะไร แต่ y = 5

print(x)              # None  (ฟังก์ชันไม่ได้ return อะไร)
print(y * 10)         # 50    (นำไปคำนวณต่อได้)

สรุป: ถ้าต้องการนำผลไปใช้ต่อ ให้ใช้ return ถ้าแค่อยากแสดงผลให้คนดู ใช้ print ฟังก์ชันคำนวณเกือบทั้งหมดควร return

ค่า default

กำหนดค่าเริ่มต้นให้ parameter ได้ ถ้าผู้เรียกไม่ส่งค่ามาจะใช้ค่า default แทน ทำให้ฟังก์ชันเรียกง่ายขึ้น

python
def greet(name, greeting="สวัสดี"):
    return f"{greeting} {name}"

print(greet("Aphisit"))               # สวัสดี Aphisit
print(greet("Aphisit", "หวัดดี"))     # หวัดดี Aphisit
print(greet(name="Mali", greeting="ดีจ้า"))  # ระบุชื่อ parameter ได้

รับจำนวนไม่จำกัด: *args และ **kwargs

python
def total(*nums):            # *args รับกี่ตัวก็ได้ (เป็น tuple)
    return sum(nums)
print(total(1, 2, 3))        # 6
print(total(1, 2, 3, 4, 5))  # 15

def profile(**info):         # **kwargs รับเป็นคู่ key=value (เป็น dict)
    for key, value in info.items():
        print(f"{key}: {value}")
profile(name="Aphisit", age=25)

ฟังก์ชันสั้น ๆ ด้วย lambda

lambda คือฟังก์ชันบรรทัดเดียวไม่มีชื่อ มักใช้กับการเรียงลำดับหรือ filter ข้อมูล

python
square = lambda x: x ** 2
print(square(5))             # 25

# ใช้บ่อยกับ sorted() เพื่อบอกว่าเรียงตามอะไร
people = [{"name": "A", "age": 30}, {"name": "B", "age": 20}]
result = sorted(people, key=lambda p: p["age"])
print(result[0]["name"])     # B  (อายุน้อยสุดมาก่อน)

เขียน docstring อธิบายฟังก์ชัน

python
def bmi(weight, height):
    """คำนวณ BMI จากน้ำหนัก(กก.) และส่วนสูง(เมตร)"""
    return weight / (height ** 2)

print(bmi.__doc__)   # แสดงคำอธิบายของฟังก์ชัน

Type Hints — บอกชนิดข้อมูล (มาตรฐานสมัยใหม่)

เราเขียน "ใบ้" ชนิดข้อมูลของ parameter และค่าที่ return ได้ ไม่บังคับตอนรัน แต่ช่วยให้ editor เตือน bug และคนอ่านเข้าใจง่าย — โค้ดในงานจริงสมัยนี้นิยมใส่

python
def bmi(weight: float, height: float) -> float:
    return weight / (height ** 2)

def greet(name: str, times: int = 1) -> str:
    return (f"สวัสดี {name} ") * times

# name: str = parameter ชนิด str, -> str = ฟังก์ชันคืน str
กับดัก: อย่าใช้ list/dict เป็นค่า default

เขียน def f(items=[]) เป็นบั๊กคลาสสิก เพราะ list ถูกสร้างครั้งเดียวตอนนิยามฟังก์ชัน แล้วใช้ร่วมกันทุกครั้งที่เรียก ค่าจะค้างข้ามการเรียก! วิธีแก้: ใช้ items=None แล้วสร้าง list ใหม่ข้างใน (if items is None: items = []) — เรื่องนี้จะเข้าใจลึกขึ้นในคอร์สเชิงลึก

สรุปหัวข้อนี้

  • def นิยามฟังก์ชัน เรียกใช้ด้วยชื่อตามด้วยวงเล็บ ()
  • parameter รับค่าเข้า ทำให้ฟังก์ชันยืดหยุ่น
  • return ส่งค่ากลับเพื่อนำไปใช้ต่อ (ต่างจาก print ที่แค่แสดง)
  • ค่า default ทำให้ parameter ไม่บังคับส่ง
  • *args/**kwargs รับจำนวนอาร์กิวเมนต์ไม่จำกัด
  • lambda คือฟังก์ชันบรรทัดเดียว เหมาะกับ sorted/filter
  • type hint (name: str -> int) ช่วยเตือน bug; ห้ามใช้ list/dict เป็นค่า default
แบบฝึกหัด

1) เขียนฟังก์ชัน is_even(n) คืน True/False 2) เขียน max_of_three(a,b,c) คืนค่ามากสุด 3) เขียน greet(name, lang="th") ที่ทักทายต่างภาษาตาม lang 4) เขียนฟังก์ชันรับลิสต์ตัวเลข แล้ว return ทั้งผลรวมและค่าเฉลี่ย 5) ใช้ sorted + lambda เรียงรายชื่อตามความยาวของชื่อ