parsiyeller inanılmaz derecede faydalıdır.
Örneğin, 'boru hatlı' işlev çağrıları dizisinde (bir işlevden döndürülen değerin bir sonrakine iletilen argüman olduğu).
Bazen böyle bir boru hattındaki bir işlev için tek bir bağımsız değişken gerekir , ancak hemen akış yönündeki işlev iki değer döndürür .
Bu senaryoda, functools.partial
bu işlev ardışık düzenini sağlam tutmanıza izin verebilir.
Aşağıda belirli ve izole bir örnek verilmiştir: bazı verileri her veri noktasının belirli bir hedeften uzaklığına göre sıralamak istediğinizi varsayalım:
# 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)
Bu verileri hedeften uzaklığa göre sıralamak için, elbette yapmak istediğiniz şey şudur:
data.sort(key=euclid_dist)
ancak yapamazsınız - sort yönteminin anahtar parametresi yalnızca tek bir argüman alan işlevleri kabul eder .
tek bir parametre euclid_dist
alan bir işlev olarak yeniden yazın :
from functools import partial
p_euclid_dist = partial(euclid_dist, target)
p_euclid_dist
şimdi tek bir argümanı kabul ediyor,
>>> p_euclid_dist((3, 3))
1.4142135623730951
böylece sıralama yönteminin anahtar bağımsız değişkeninin kısmi işlevini ileterek verilerinizi sıralayabilirsiniz:
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
Veya örneğin, işlevin bağımsız değişkenlerinden biri dış döngüde değişir, ancak iç döngüde yineleme sırasında sabitlenir. Kısmi kullanarak, iç döngünün yinelemesi sırasında ek parametreyi iletmeniz gerekmez, çünkü değiştirilmiş (kısmi) işlev gerektirmez.
>>> from functools import partial
>>> def fnx(a, b, c):
return a + b + c
>>> fnx(3, 4, 5)
12
kısmi işlev oluşturma (arg anahtar sözcüğünü kullanarak)
>>> pfnx = partial(fnx, a=12)
>>> pfnx(b=4, c=5)
21
konumsal bir argümanla kısmi bir işlev de oluşturabilirsiniz
>>> pfnx = partial(fnx, 12)
>>> pfnx(4, 5)
21
ancak bu atar (örneğin, anahtar kelime bağımsız değişkeniyle kısmi oluşturma ve ardından konumsal bağımsız değişkenler kullanarak çağırma)
>>> 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'
başka bir kullanım örneği: python multiprocessing
kütüphanesini kullanarak dağıtılmış kod yazma . Havuz yöntemi kullanılarak bir işlem havuzu oluşturulur:
>>> import multiprocessing as MP
>>> # create a process pool:
>>> ppool = MP.Pool()
Pool
bir harita yöntemine sahiptir, ancak yalnızca tek bir yinelenebilir sürer, bu nedenle daha uzun bir parametre listesiyle bir işlevi iletmeniz gerekiyorsa, biri hariç tümünü düzeltmek için işlevi kısmi olarak yeniden tanımlayın:
>>> ppool.map(pfnx, [4, 6, 7, 8])
extra_args
değişkeni