parsial sangat berguna.
Misalnya, dalam urutan pemanggilan fungsi 'pipa-baris' (di mana nilai yang dikembalikan dari satu fungsi adalah argumen yang diteruskan ke yang berikutnya).
Kadang-kadang fungsi dalam pipa seperti itu membutuhkan argumen tunggal , tetapi fungsi segera hulu dari itu mengembalikan dua nilai .
Dalam skenario ini, functools.partial
mungkin memungkinkan Anda untuk menjaga fungsi pipeline fungsi ini.
Berikut adalah contoh khusus dan terisolasi: misalkan Anda ingin mengurutkan beberapa data berdasarkan jarak setiap titik data dari beberapa target:
# 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)
Untuk mengurutkan data ini berdasarkan jarak dari target, apa yang ingin Anda lakukan tentu saja adalah ini:
data.sort(key=euclid_dist)
tetapi Anda tidak bisa - parameter kunci metode sortir hanya menerima fungsi yang mengambil satu argumen.
jadi tulis ulang euclid_dist
sebagai fungsi yang mengambil parameter tunggal :
from functools import partial
p_euclid_dist = partial(euclid_dist, target)
p_euclid_dist
sekarang menerima satu argumen,
>>> p_euclid_dist((3, 3))
1.4142135623730951
jadi sekarang Anda dapat mengurutkan data Anda dengan mengirimkan fungsi parsial untuk argumen kunci metode sortir:
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
Atau misalnya, salah satu argumen fungsi berubah di loop luar tetapi diperbaiki selama iterasi di loop dalam. Dengan menggunakan parsial, Anda tidak harus meneruskan parameter tambahan selama iterasi loop dalam, karena fungsi yang dimodifikasi (parsial) tidak memerlukannya.
>>> from functools import partial
>>> def fnx(a, b, c):
return a + b + c
>>> fnx(3, 4, 5)
12
buat fungsi parsial (menggunakan kata kunci arg)
>>> pfnx = partial(fnx, a=12)
>>> pfnx(b=4, c=5)
21
Anda juga dapat membuat fungsi parsial dengan argumen posisi
>>> pfnx = partial(fnx, 12)
>>> pfnx(4, 5)
21
tetapi ini akan melempar (mis., membuat sebagian dengan argumen kata kunci lalu memanggil menggunakan argumen posisional)
>>> 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'
kasus penggunaan lain: menulis kode terdistribusi menggunakan multiprocessing
pustaka python . Kumpulan proses dibuat menggunakan metode Pool:
>>> import multiprocessing as MP
>>> # create a process pool:
>>> ppool = MP.Pool()
Pool
memiliki metode peta, tetapi hanya membutuhkan satu iterable, jadi jika Anda harus meneruskan fungsi dengan daftar parameter yang lebih panjang, tentukan kembali fungsi sebagai parsial, untuk memperbaiki semua kecuali satu:
>>> ppool.map(pfnx, [4, 6, 7, 8])
extra_args
variabel