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 de maxsize 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 of 3.0 en 3 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 .



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow