Python Language
Functools Module
Zoeken…
gedeeltelijk
De partial
functie maakt een toepassing voor gedeeltelijke functies van een andere functie. Het wordt gebruikt om waarden te binden aan enkele van de functieargumenten (of trefwoordargumenten) en een opvraagbare te produceren zonder de reeds gedefinieerde argumenten.
>>> from functools import partial
>>> unhex = partial(int, base=16)
>>> unhex.__doc__ = 'Convert base16 string to int'
>>> unhex('ca11ab1e')
3390155550
partial()
, zoals de naam al aangeeft, maakt een gedeeltelijke evaluatie van een functie mogelijk. Laten we het volgende voorbeeld bekijken:
In [2]: from functools import partial
In [3]: def f(a, b, c, x):
...: return 1000*a + 100*b + 10*c + x
...:
In [4]: g = partial(f, 1, 1, 1)
In [5]: print g(2)
1112
Wanneer g
wordt gemaakt, wordt f
, waarvoor vier argumenten nodig zijn ( a, b, c, x
), ook gedeeltelijk geëvalueerd voor de eerste drie argumenten, a, b, c,
De evaluatie van f
is voltooid wanneer g
wordt genoemd, g(2)
, die het vierde argument doorgeeft aan f
.
Een manier om partial
te denken is een schuifregister; tegelijkertijd één argument indringen in een functie. partial
komt van pas voor gevallen waarin gegevens als stream binnenkomen en we niet meer dan één argument kunnen doorgeven.
total_ordering
Wanneer we een te bestellen klasse willen maken, moeten we normaal de methoden __eq()__
, __lt__()
, __le__()
, __gt__()
en __ge__()
.
De decorateur total_ordering
, toegepast op een klasse, staat de definitie toe van __eq__()
en slechts één tussen __lt__()
, __le__()
, __gt__()
en __ge__()
, en staat nog steeds alle __ge__()
voor de klasse toe.
@total_ordering
class Employee:
...
def __eq__(self, other):
return ((self.surname, self.name) == (other.surname, other.name))
def __lt__(self, other):
return ((self.surname, self.name) < (other.surname, other.name))
De decorateur gebruikt een samenstelling van de verstrekte methoden en algebraïsche bewerkingen om de andere vergelijkingsmethoden af te leiden. Als we bijvoorbeeld __lt__()
en __eq()__
hebben gedefinieerd en we __gt__()
willen afleiden, kunnen we eenvoudig not __lt__() and not __eq()__
.
Opmerking : de functie total_ordering
is alleen beschikbaar sinds Python 2.7.
verminderen
In Python 3.x is de reduce
die hier al is uitgelegd , verwijderd uit de ingebouwde functies en moet deze nu worden geïmporteerd uit functools
.
from functools import reduce
def factorial(n):
return reduce(lambda a, b: (a*b), range(1, n+1))
lru_cache
De decorateur @lru_cache
kan worden gebruikt met een dure, rekenintensieve functie met een minst recent gebruikte cache. Hiermee kunnen functieaanroepen worden opgeslagen, zodat toekomstige oproepen met dezelfde parameters onmiddellijk kunnen worden teruggestuurd in plaats van opnieuw te worden berekend.
@lru_cache(maxsize=None) # Boundless cache
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
>>> fibonacci(15)
In het bovenstaande voorbeeld wordt de waarde van fibonacci(3)
slechts eenmaal berekend, terwijl als fibonacci
geen LRU-cache had, fibonacci(3)
230 keer hoger zou zijn berekend. Daarom is @lru_cache
vooral geweldig voor recursieve functies of dynamisch programmeren, waarbij een dure functie meerdere keren met dezelfde exacte parameters kan worden aangeroepen.
@lru_cache
heeft twee argumenten
-
maxsize
: aantal oproepen om op te slaan. Wanneer het aantal unieke oproepen demaxsize
overschrijdt, verwijdert de LRU-cache de minst recent gebruikte oproepen. -
typed
(toegevoegd in 3.3): vlag om te bepalen of equivalente argumenten van verschillende typen tot verschillende cacherecords behoren (dwz of3.0
en3
als verschillende argumenten tellen)
We kunnen ook cachestatistieken bekijken:
>>> fib.cache_info()
CacheInfo(hits=13, misses=16, maxsize=None, currsize=16)
OPMERKING : Omdat @lru_cache
woordenboeken gebruikt om resultaten te cachen, moeten alle parameters voor de functie hashable zijn om de cache te laten werken.
Officiële Python-documenten voor @lru_cache
. @lru_cache
is toegevoegd in 3.2.
cmp_to_key
Python heeft zijn sorteermethoden gewijzigd om een sleutelfunctie te accepteren. Die functies hebben een waarde nodig en geven een sleutel terug die wordt gebruikt om de arrays te sorteren.
Oude vergelijkingsfuncties namen twee waarden aan en retourneerden -1, 0 of +1 als het eerste argument klein, gelijk of groter is dan het tweede argument. Dit is niet compatibel met de nieuwe sleutelfunctie.
Dat is waar functools.cmp_to_key
binnenkomt:
>>> import functools
>>> import locale
>>> sorted(["A", "S", "F", "D"], key=functools.cmp_to_key(locale.strcoll))
['A', 'D', 'F', 'S']
Voorbeeld genomen en aangepast uit de standaarddocumentatie van Python .