งาน Partialsมีประโยชน์อย่างเหลือเชื่อ
ตัวอย่างเช่นในลำดับ 'ไปป์ไลน์' ของการเรียกฟังก์ชัน (ซึ่งค่าที่ส่งคืนจากฟังก์ชันหนึ่งคืออาร์กิวเมนต์ที่ส่งผ่านไปยังถัดไป)
บางครั้งฟังก์ชั่นในท่อดังกล่าวต้องใช้อาร์กิวเมนต์เดียวแต่ฟังก์ชั่นได้ทันทีจากต้นน้ำก็จะส่งกลับสองค่า
ในสถานการณ์สมมตินี้functools.partial
อาจอนุญาตให้คุณรักษาฟังก์ชันการทำงานของไพพ์ไลน์นี้ไว้
นี่คือตัวอย่างที่แยกได้เฉพาะ: สมมติว่าคุณต้องการเรียงลำดับข้อมูลตามระยะทางของจุดข้อมูลแต่ละจุดจากเป้าหมาย:
# create some data
import random as RND
fnx = lambda: RND.randint(0, 10)
data = [ (fnx(), fnx()) for c in range(10) ]
target = (2, 4)
import math
def euclid_dist(v1, v2):
x1, y1 = v1
x2, y2 = v2
return math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
ในการจัดเรียงข้อมูลตามระยะทางจากเป้าหมายสิ่งที่คุณต้องการทำคือ:
data.sort(key=euclid_dist)
แต่คุณทำไม่ได้ - พารามิเตอร์หลักของวิธีการเรียงรับฟังก์ชั่นที่รับอาร์กิวเมนต์เดียวเท่านั้น
ดังนั้นเขียนใหม่euclid_dist
เป็นฟังก์ชันโดยใช้พารามิเตอร์เดียว :
from functools import partial
p_euclid_dist = partial(euclid_dist, target)
p_euclid_dist
ตอนนี้ยอมรับอาร์กิวเมนต์เดียว
>>> p_euclid_dist((3, 3))
1.4142135623730951
ดังนั้นตอนนี้คุณสามารถจัดเรียงข้อมูลของคุณโดยส่งผ่านฟังก์ชั่นบางส่วนสำหรับอาร์กิวเมนต์ที่สำคัญของวิธีการจัดเรียง:
data.sort(key=p_euclid_dist)
# verify that it works:
for p in data:
print(round(p_euclid_dist(p), 3))
1.0
2.236
2.236
3.606
4.243
5.0
5.831
6.325
7.071
8.602
หรือตัวอย่างเช่นหนึ่งในข้อโต้แย้งของฟังก์ชั่นการเปลี่ยนแปลงในวงด้านนอก แต่ได้รับการแก้ไขในระหว่างการทำซ้ำในวงด้านใน ด้วยการใช้บางส่วนคุณไม่จำเป็นต้องผ่านพารามิเตอร์เพิ่มเติมในระหว่างการวนซ้ำของวงในเนื่องจากฟังก์ชั่นการแก้ไข (บางส่วน) ไม่จำเป็นต้องใช้
>>> from functools import partial
>>> def fnx(a, b, c):
return a + b + c
>>> fnx(3, 4, 5)
12
สร้างฟังก์ชั่นบางส่วน (ใช้ ARG คำหลัก)
>>> pfnx = partial(fnx, a=12)
>>> pfnx(b=4, c=5)
21
คุณสามารถสร้างฟังก์ชั่นบางส่วนด้วยอาร์กิวเมนต์ตำแหน่ง
>>> pfnx = partial(fnx, 12)
>>> pfnx(4, 5)
21
แต่สิ่งนี้จะแสดง (เช่นการสร้างบางส่วนด้วยอาร์กิวเมนต์คำหลักจากนั้นเรียกใช้อาร์กิวเมนต์ตำแหน่ง)
>>> pfnx = partial(fnx, a=12)
>>> pfnx(4, 5)
Traceback (most recent call last):
File "<pyshell#80>", line 1, in <module>
pfnx(4, 5)
TypeError: fnx() got multiple values for keyword argument 'a'
กรณีการใช้งานอื่น: การเขียนรหัสการกระจายโดยใช้multiprocessing
ห้องสมุดของงูใหญ่ กลุ่มของกระบวนการถูกสร้างขึ้นโดยใช้วิธีกลุ่ม:
>>> import multiprocessing as MP
>>> # create a process pool:
>>> ppool = MP.Pool()
Pool
มีวิธีการแมป แต่ใช้เพียง iterable เดียวเท่านั้นดังนั้นหากคุณต้องการส่งผ่านฟังก์ชันที่มีรายการพารามิเตอร์ที่ยาวขึ้นให้กำหนดฟังก์ชันเป็นบางส่วนอีกครั้งเพื่อแก้ไขทั้งหมดยกเว้นวิธีเดียว:
>>> ppool.map(pfnx, [4, 6, 7, 8])
extra_args
ตัวแปร