les partiels sont incroyablement utile, indispensable, parfois-par exemple, une fonction, vous devez appeler à côté n'accepte qu'un seul argument et vous avez deux valeurs retournées à partir de l'étape précédente.
supposons que vous voulez trier certaines données par chaque point de la distance d'une cible:
# 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)
pour trier les données en fonction de la distance de la cible, ce que vous voulez faire est bien sûr ce:
data.sort(key=euclid_dist)
mais vous ne pouvez pas--le tri de la méthode clé paramètre accepte uniquement les fonctions qui prennent un seul argument.
donc ré-écrire euclid_dist comme une fonction prenant un seul paramètre:
from functools import partial
p_euclid_dist = partial(euclid_dist, target)
p_euclid_dist maintenant accepte un seul argument,
>>> p_euclid_dist((3, 3))
1.4142135623730951
alors maintenant, vous pouvez trier vos données en passant par la fonction partielle de la méthode de tri de l'argument-clé:
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
Ou par exemple, les arguments de la fonction des changements dans une boucle externe, mais est fixe au cours d'une itération dans la boucle interne. À l'aide d'un partiel, vous n'avez pas à passer dans le paramètre supplémentaire au cours d'une itération de la boucle interne, en raison de la modification de la (partielle) de la fonction ne l'exige pas.
>>> from functools import partial
>>> def fnx(a, b, c):
return a + b + c
>>> fnx(3, 4, 5)
12
créer une fonction partielle (à l'aide de mots clés arg)
>>> pfnx = partial(fnx, a=12)
>>> pfnx(b=4, c=5)
21
vous pouvez également créer une fonction partielle avec une position d'argument
>>> pfnx = partial(fnx, 12)
>>> pfnx(4, 5)
21
mais cela permettra de lancer (par exemple, la création d'partielle avec argument mot-clé, puis de l'appel à l'aide des arguments de position)
>>> 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'
un autre cas d'utilisation: l'écriture distribué code à l'aide de python multitraitement de la bibliothèque. Un pool de processus est créé à l'aide de la Piscine de la méthode:
>>> import multiprocessing as MP
>>> # create a process pool:
>>> ppool = MP.Pool()
La piscine dispose d'une carte de la méthode, mais il ne prend qu'un seul objet iterable, donc si vous avez besoin de passer dans une fonction avec une longue liste de paramètres, de re-définir la fonction partielle, de fixer tous, sauf un:
>>> ppool.map(pfnx, [4, 6, 7, 8])