Python Language
Functools-Modul
Suche…
teilweise
Die partial
erstellt eine Teilfunktionsanwendung aus einer anderen Funktion. Es wird verwendet, um Werte an einige Argumente der Funktion (oder Schlüsselwortargumente) zu binden und eine Aufruffunktion ohne die bereits definierten Argumente zu erzeugen.
>>> from functools import partial
>>> unhex = partial(int, base=16)
>>> unhex.__doc__ = 'Convert base16 string to int'
>>> unhex('ca11ab1e')
3390155550
partial()
erlaubt, wie der Name schon sagt, eine partielle Bewertung einer Funktion. Schauen wir uns folgendes Beispiel an:
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
Wenn g
erstellt wird, wird f
mit vier Argumenten ( a, b, c, x
) auch für die ersten drei Argumente a, b, c,
Die Bewertung von f
ist abgeschlossen, wenn g
aufgerufen wird, g(2)
, wodurch das vierte Argument an f
.
Eine Möglichkeit, an partial
zu denken, ist ein Schieberegister; ein Argument zu einer Zeit in eine Funktion einschieben. partial
praktisch für Fälle, in denen Daten als Stream eingehen und wir nur ein Argument übergeben können.
total_ordering
Wenn Sie eine bestellbare Klasse erstellen möchten, müssen Sie normalerweise die Methoden __eq()__
, __lt__()
, __le__()
, __gt__()
und __ge__()
.
Der total_ordering
Dekorator, der auf eine Klasse angewendet wird, erlaubt die Definition von __eq__()
und nur eines zwischen __lt__()
, __le__()
, __gt__()
und __ge__()
, und erlaubt dennoch alle __ge__()
für die Klasse.
@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))
Der Dekorateur verwendet eine Zusammensetzung der bereitgestellten Methoden und algebraischen Operationen, um die anderen Vergleichsmethoden abzuleiten. Wenn wir beispielsweise __lt__()
und __eq()__
definiert haben und __lt__()
ableiten __gt__()
, können wir einfach not __lt__() and not __eq()__
prüfen.
Hinweis : Die Funktion total_ordering
ist erst seit Python 2.7 verfügbar.
reduzieren
In Python 3.x, die reduce
bereits erläuterte Funktion hier wurde von den Einbauten entfernt und muss nun von importiert werden functools
.
from functools import reduce
def factorial(n):
return reduce(lambda a, b: (a*b), range(1, n+1))
lru_cache
Der @lru_cache
Dekorateur kann mit einer Verpackung , eine teure, rechenintensive Funktion verwendet werden Least Recently Used - Cache. Auf diese Weise können Funktionsaufrufe gespeichert werden, sodass zukünftige Aufrufe mit denselben Parametern sofort zurückgegeben werden können, anstatt neu berechnet zu werden.
@lru_cache(maxsize=None) # Boundless cache
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
>>> fibonacci(15)
In dem obigen Beispiel der Wert der fibonacci(3)
wird nur einmal berechnet, während , wenn fibonacci
keine LRU - Cache hat, fibonacci(3)
würde nach oben von 230 mal berechnet wurde. Daher ist @lru_cache
besonders für rekursive Funktionen oder für die dynamische Programmierung @lru_cache
, bei denen eine teure Funktion mit denselben exakten Parametern mehrmals aufgerufen werden könnte.
@lru_cache
hat zwei Argumente
-
maxsize
: Anzahl der zu speichernden Anrufe. Wenn die Anzahl der eindeutigen Aufrufemaxsize
überschreitet, werden die zuletzt verwendeten Aufrufe durch den LRU-Cache entfernt. -
typed
(hinzugefügt in 3.3): Flag zum Bestimmen, ob äquivalente Argumente verschiedener Typen zu unterschiedlichen Cache-Datensätzen gehören (dh, wenn3.0
und3
als unterschiedliche Argumente zählen)
Wir können auch Cache-Statistiken sehen:
>>> fib.cache_info()
CacheInfo(hits=13, misses=16, maxsize=None, currsize=16)
HINWEIS : Da @lru_cache
Wörterbücher zum Zwischenspeichern von Ergebnissen verwendet, müssen alle Parameter für die Funktion hashierbar sein, damit der Cache funktioniert.
Offizielle Python-Dokumente für @lru_cache
. @lru_cache
wurde in 3.2 hinzugefügt.
cmp_to_key
Python hat seine Sortiermethoden geändert, um eine Schlüsselfunktion zu akzeptieren. Diese Funktionen nehmen einen Wert an und geben einen Schlüssel zurück, mit dem die Arrays sortiert werden.
Alte Vergleichsfunktionen verwendeten zwei Werte und geben -1, 0 oder +1 zurück, wenn das erste Argument klein, gleich oder größer als das zweite Argument ist. Dies ist nicht kompatibel mit der neuen Tastenfunktion.
functools.cmp_to_key
kommt functools.cmp_to_key
ins functools.cmp_to_key
:
>>> import functools
>>> import locale
>>> sorted(["A", "S", "F", "D"], key=functools.cmp_to_key(locale.strcoll))
['A', 'D', 'F', 'S']
Beispiel genommen und angepasst aus der Python Standard Library-Dokumentation .