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 Aufrufe maxsize ü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, wenn 3.0 und 3 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 .



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow