0Pricing
Python Academy · บทเรียน

ฟังก์ชันบางส่วน

ใช้ functools.partial

ฟังก์ชันบางส่วน เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

ฟังก์ชันที่กำหนดอาร์กิวเมนต์ล่วงหน้าคืออะไร

functools.partial สร้างฟังก์ชันใหม่โดยเติมอาร์กิวเมนต์บางส่วนของฟังก์ชันเดิมไว้ล่วงหน้า เปรียบเสมือนการเตรียมอาร์กิวเมนต์ไว้ก่อน เพื่อให้คุณเรียกใช้ผลลัพธ์ด้วยอาร์กิวเมนต์ที่น้อยลงได้

นำเข้าโดยใช้ from functools import partial

from functools import partial
def power(base, exp):
    return base ** exp
square = partial(power, exp=2)
print(square(5))

การกำหนดอาร์กิวเมนต์ตามตำแหน่งล่วงหน้า

อาร์กิวเมนต์ตามตำแหน่งที่ส่งให้ partial จะเติมพารามิเตอร์ของฟังก์ชันจากด้านซ้าย อาร์กิวเมนต์ที่เหลือจะถูกส่งให้เมื่อคุณเรียกใช้ฟังก์ชันที่กำหนดอาร์กิวเมนต์ล่วงหน้าแล้ว

from functools import partial
def multiply(a, b):
    return a * b
double = partial(multiply, 2)
print(double(10))
print(double(50))

การกำหนดอาร์กิวเมนต์ตามคำสำคัญล่วงหน้า

อาร์กิวเมนต์ตามคำสำคัญที่ให้กับ partial จะกลายเป็นค่าเริ่มต้น ซึ่งคุณยังสามารถเขียนทับได้ขณะเรียกใช้

from functools import partial
def greet(name, greeting='Hello'):
    return greeting + ', ' + name
hola = partial(greet, greeting='Hola')
print(hola('Ada'))
print(hola('Bob', greeting='Hey'))

ฟังก์ชันที่กำหนดอาร์กิวเมนต์ล่วงหน้ากับฟังก์ชันในตัว

คุณสามารถกำหนดอาร์กิวเมนต์ล่วงหน้าให้ฟังก์ชันในตัวได้เช่นกัน ในที่นี้เราสร้างตัวแยกวิเคราะห์จำนวนเต็มฐานสองจาก int

from functools import partial
binary = partial(int, base=2)
print(binary('1010'))
print(binary('1111'))

ฟังก์ชันเรียกกลับที่สะอาดขึ้น

ฟังก์ชันที่กำหนดอาร์กิวเมนต์ล่วงหน้าเหมาะอย่างยิ่งสำหรับฟังก์ชันเรียกกลับที่ต้องรับฟังก์ชันแบบไม่มีอาร์กิวเมนต์หรือมีอาร์กิวเมนต์เดียว แต่คุณต้องการเตรียมบริบทไว้ล่วงหน้า

from functools import partial
def log(level, message):
    return '[' + level + '] ' + message
error = partial(log, 'ERROR')
print(error('disk full'))

ฟังก์ชันที่กำหนดอาร์กิวเมนต์ล่วงหน้าใน map

ฟังก์ชันที่กำหนดอาร์กิวเมนต์ล่วงหน้าเข้ากับฟังก์ชันลำดับสูงอย่าง map ได้พอดี โดยกำหนดอาร์กิวเมนต์หนึ่งตัวไว้ตายตัว ขณะที่อีกตัวเปลี่ยนไปตามแต่ละรายการ

from functools import partial
def add(a, b):
    return a + b
add10 = partial(add, 10)
print(list(map(add10, [1, 2, 3])))

การตรวจสอบฟังก์ชันที่กำหนดอาร์กิวเมนต์ล่วงหน้า

อ็อบเจกต์ที่กำหนดอาร์กิวเมนต์ล่วงหน้าจะแสดงฟังก์ชันที่ห่อหุ้มไว้ผ่าน .func อาร์กิวเมนต์ตามตำแหน่งที่กำหนดไว้ผ่าน .args และอาร์กิวเมนต์ตามคำสำคัญที่กำหนดไว้ผ่าน .keywords

from functools import partial
def f(a, b, c):
    return (a, b, c)
p = partial(f, 1, c=3)
print(p.func.__name__)
print(p.args)
print(p.keywords)

การซ้อนฟังก์ชันที่กำหนดอาร์กิวเมนต์ล่วงหน้า

คุณสามารถสร้างฟังก์ชันที่กำหนดอาร์กิวเมนต์ล่วงหน้าจากฟังก์ชันอีกตัวที่กำหนดอาร์กิวเมนต์ล่วงหน้าไว้แล้ว แล้วเพิ่มอาร์กิวเมนต์ที่ตายตัวทีละขั้นได้

from functools import partial
def volume(l, w, h):
    return l * w * h
base = partial(volume, 2)
slab = partial(base, 3)
print(slab(4))

ฟังก์ชันที่กำหนดอาร์กิวเมนต์ล่วงหน้ากับแลมบ์ดา

lambda สามารถทำงานเดียวกันได้ แต่ partial มักสื่อความหมายชัดเจนกว่าเมื่อต้องกำหนดอาร์กิวเมนต์ และยังแสดงฟังก์ชันที่ห่อหุ้มไว้สำหรับการตรวจสอบภายในได้

from functools import partial
def power(base, exp):
    return base ** exp
cube_p = partial(power, exp=3)
cube_l = lambda b: power(b, 3)
print(cube_p(2), cube_l(2))

ตัวอย่างจริง: การปัดเศษ

สร้างฟังก์ชันปัดเศษให้เหลือสองตำแหน่งทศนิยมด้วยการกำหนดอาร์กิวเมนต์ล่วงหน้าให้ฟังก์ชันในตัว round

from functools import partial
round2 = partial(round, ndigits=2)
print(round2(3.14159))
print(round2(2.71828))

การกำหนดอาร์กิวเมนต์ล่วงหน้าสำหรับคลาส

functools.partialmethod ที่เกี่ยวข้องทำงานแบบเดียวกันกับเมธอดภายในนิยามคลาส โดยเติมอาร์กิวเมนต์ให้เมธอดไว้ล่วงหน้า

from functools import partialmethod
class Light:
    def set(self, state):
        self.state = state
        return state
    on = partialmethod(set, True)
    off = partialmethod(set, False)
l = Light()
print(l.on())
print(l.off())

ตรวจสอบความเข้าใจ

functools.partial ทำหน้าที่อะไร

สรุปทบทวน: ฟังก์ชันที่กำหนดอาร์กิวเมนต์ล่วงหน้า

คุณได้เรียนรู้ว่า functools.partial:

  • สร้างฟังก์ชันใหม่โดยเติมอาร์กิวเมนต์บางส่วนไว้ล่วงหน้า ทั้งแบบตามตำแหน่งหรือแบบตามคำสำคัญ
  • เปิดโอกาสให้คุณเขียนทับค่าเริ่มต้นตามคำสำคัญที่กำหนดไว้แล้วขณะเรียกใช้
  • เหมาะอย่างยิ่งสำหรับฟังก์ชันเรียกกลับ map และการลดการเขียนซ้ำ
  • แสดง .func, .args และ .keywords อีกทั้งมีรูปแบบที่เป็นเมธอดคือ partialmethod
from functools import partial
add = lambda a, b: a + b
plus1 = partial(add, 1)
print(plus1(41))

คำถามที่พบบ่อย

บทเรียน “ฟังก์ชันบางส่วน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ฟังก์ชันบางส่วน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ฟังก์ชันบางส่วน”

ใช้ functools.partial คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ฟังก์ชันบางส่วน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ฟังก์ชันชั้นหนึ่ง
  2. คลอเชอร์และตัวแปรอิสระ
  3. nonlocal และสถานะที่เปลี่ยนแปลงได้
  4. ฟังก์ชันบางส่วน
← กลับไปที่ Python Academy