Partial Function ช่วยให้เราสร้างฟังก์ชันใหม่จากฟังก์ชันเดิมโดย "ล็อก" ค่าพารามิเตอร์บางส่วนไว้ล่วงหน้า ทำให้โค้ด reusable และอ่านง่ายขึ้น Python ให้มาจากโมดูล functools
ตัวอย่างพื้นฐาน
>> from functools import partial
>>> from operator import add
>>> add(1, 2)
3
# สร้างฟังก์ชันใหม่ที่บวก 4 เข้าไปเสมอ
>>> add1 = partial(add, 4)
>>> add1(6)
10
>>> add1(10)
14
partial(add, 4) คืนฟังก์ชันใหม่ที่รับอาร์กิวเมนต์เดียว (y) และคืน 4 + y
ใช้กับ map() และฟังก์ชันระดับสูง
>> list(map(add1, [1, 2, 3, 4, 5]))
[5, 6, 7, 8, 9]
# สร้าง partial ซ้อนกัน
>>> seven = partial(add1, 3)
>>> seven()
7
ใช้กับ Method ของออบเจกต์
>> str1 = "Hello, Python"
>>> hello_str = partial(str1.replace, "Python")
>>> hello_str("Tutorialspoint")
'Hello, Tutorialspoint'
>>> hello_str("Java")
'Hello, Java'
ที่นี่ partial ล็อกอาร์กิวเมนต์แรกของ str.replace (คือ substring ที่จะแทนที่) ไว้เป็น "Python"
เมื่อไหร่ควรใช้ Partial Function?
- ต้องเรียกฟังก์ชันเดิมหลายครั้งด้วยอาร์กิวเมนต์บางส่วนคงที่
- ต้องส่งฟังก์ชัน callback ที่มี signature ตรงกับที่ framework ต้องการ
- อยากลดความซ้ำซ้อนของ lambda ที่ซับซ้อน
Partial function เป็นเครื่องมือที่มีประโยชน์มากเมื่อต้องการผูกอาร์กิวเมนต์บางส่วนให้คงที่ และใช้ฟังก์ชันที่ได้เหมือนฟังก์ชันทั่วไป