On this page
ฟังก์ชัน (Functions)
จัดกลุ่มคำสั่งให้เป็นชุดที่เรียกใช้ซ้ำได้ — parameter, return, ค่า default, *args/**kwargs และ lambda
ฟังก์ชันคือการรวมคำสั่งหลายบรรทัดเป็นชุดที่ตั้งชื่อไว้ เรียกใช้กี่ครั้งก็ได้ ทำให้โค้ดสั้น ไม่ซ้ำซ้อน และแก้ที่เดียวพอ ถือเป็นทักษะที่ยกระดับโค้ดของคุณจาก "สคริปต์" เป็น "โปรแกรม" จริง ๆ
นิยามและเรียกใช้ฟังก์ชัน
def greet(): # def = define นิยามฟังก์ชัน
print("สวัสดีครับ")
print("ยินดีต้อนรับ")
greet() # เรียกใช้ (อย่าลืมวงเล็บ)
greet() # เรียกซ้ำได้เรื่อย ๆgreet หมายถึงตัวฟังก์ชันเอง ส่วน greet() (มีวงเล็บ) คือการสั่งให้ "ทำงาน" ลืมวงเล็บคือบั๊กที่เจอบ่อย โปรแกรมจะไม่รันฟังก์ชันให้
parameter — รับค่าเข้า
parameter คือตัวแปรที่ฟังก์ชันรับเข้ามาทำงาน ทำให้ฟังก์ชันยืดหยุ่น ใช้กับข้อมูลต่างกันได้
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) # 8parameter คือชื่อตัวแปรตอน "นิยาม" ฟังก์ชัน (name) ส่วน argument คือค่าจริงที่ส่งตอน "เรียกใช้" ("Aphisit") คนมักเรียกรวม ๆ ว่า "พารามิเตอร์" ก็เข้าใจกันได้
return — ส่งค่ากลับ
ความแตกต่างสำคัญ: print แค่ "แสดง" ออกจอ แต่ return "ส่งค่ากลับ" ให้นำไปใช้ต่อได้ ฟังก์ชันที่คำนวณควรใช้ return เพื่อให้นำผลไปคิดต่อ
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 7print vs return ต่างกันอย่างไร (กดดูตัวอย่าง)
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 แทน ทำให้ฟังก์ชันเรียกง่ายขึ้น
def greet(name, greeting="สวัสดี"):
return f"{greeting} {name}"
print(greet("Aphisit")) # สวัสดี Aphisit
print(greet("Aphisit", "หวัดดี")) # หวัดดี Aphisit
print(greet(name="Mali", greeting="ดีจ้า")) # ระบุชื่อ parameter ได้รับจำนวนไม่จำกัด: *args และ **kwargs
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 ข้อมูล
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 อธิบายฟังก์ชัน
def bmi(weight, height):
"""คำนวณ BMI จากน้ำหนัก(กก.) และส่วนสูง(เมตร)"""
return weight / (height ** 2)
print(bmi.__doc__) # แสดงคำอธิบายของฟังก์ชันType Hints — บอกชนิดข้อมูล (มาตรฐานสมัยใหม่)
เราเขียน "ใบ้" ชนิดข้อมูลของ parameter และค่าที่ return ได้ ไม่บังคับตอนรัน แต่ช่วยให้ editor เตือน bug และคนอ่านเข้าใจง่าย — โค้ดในงานจริงสมัยนี้นิยมใส่
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เขียน 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 เรียงรายชื่อตามความยาวของชื่อ