Szukaj…


częściowy

Funkcja partial tworzy aplikację funkcji częściowej z innej funkcji. Służy do wiązania wartości z niektórymi argumentami funkcji (lub argumentów słów kluczowych) i tworzenia wywoływania bez zdefiniowanych argumentów.

>>> from functools import partial
>>> unhex = partial(int, base=16)
>>> unhex.__doc__ = 'Convert base16 string to int'
>>> unhex('ca11ab1e')
3390155550

partial() , jak sama nazwa wskazuje, pozwala na częściową ocenę funkcji. Spójrzmy na następujący przykład:

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

Po utworzeniu g f , które przyjmuje cztery argumenty ( a, b, c, x ), jest również częściowo oceniane dla pierwszych trzech argumentów, a, b, c, Ocena f jest zakończona, gdy wywoływana jest g , g(2) , która przekazuje czwarty argument do f .

Jednym ze sposobów myślenia o partial jest rejestr przesuwny; wpychając jednocześnie jeden argument do jakiejś funkcji. partial przydaje się w przypadkach, gdy dane przychodzą jako strumień i nie możemy przekazać więcej niż jednego argumentu.

total_ordering

Kiedy chcemy stworzyć uporządkowaną klasę, zwykle musimy zdefiniować metody __eq()__ , __lt__() , __le__() , __gt__() i __ge__() .

Dekorator total_ordering , zastosowany do klasy, pozwala na definicję __eq__() i tylko jednej z __lt__() , __le__() , __gt__() i __ge__() , i nadal pozwala na wszystkie operacje porządkowania na klasie.

@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))

Dekorator wykorzystuje kompozycję dostarczonych metod i operacji algebraicznych w celu uzyskania innych metod porównania. Na przykład, jeśli zdefiniowaliśmy __lt__() i __eq()__ i chcemy wyprowadzić __gt__() , możemy po prostu sprawdzić not __lt__() and not __eq()__ .

Uwaga : funkcja total_ordering jest dostępna tylko od wersji Python 2.7.

redukować

W Pythonie 3.x, wyjaśniona tutaj funkcja reduce została usunięta z wbudowanych i teraz musi zostać zaimportowana z functools .

from functools import reduce
def factorial(n):
    return reduce(lambda a, b: (a*b), range(1, n+1))

lru_cache

Dekorator @lru_cache może być używany do pakowania drogiej, intensywnej obliczeniowo funkcji za pomocą ostatnio używanej pamięci podręcznej. Umożliwia to zapamiętywanie wywołań funkcji, dzięki czemu przyszłe wywołania o tych samych parametrach mogą być natychmiast wracane bez konieczności ponownego obliczania.

@lru_cache(maxsize=None)  # Boundless cache
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

>>> fibonacci(15)

W powyższym przykładzie wartość fibonacci(3) jest obliczana tylko raz, podczas gdy gdyby fibonacci nie posiadały pamięci podręcznej LRU, fibonacci(3) zostałby obliczony w górę 230 razy. Dlatego @lru_cache jest szczególnie świetny dla funkcji rekurencyjnych lub programowania dynamicznego, w których kosztowna funkcja może być wywoływana wiele razy z tymi samymi dokładnymi parametrami.

@lru_cache ma dwa argumenty

  • maxsize : liczba połączeń do zapisania. Gdy liczba unikalnych połączeń przekroczy maxsize , pamięć podręczna LRU usunie ostatnio używane połączenia.
  • typed (dodano w 3.3): Flaga określająca, czy równoważne argumenty różnych typów należą do różnych rekordów pamięci podręcznej (tj. czy 3.0 i 3 liczą się jako różne argumenty)

Widzimy też statystyki pamięci podręcznej:

>>> fib.cache_info()
CacheInfo(hits=13, misses=16, maxsize=None, currsize=16)

UWAGA : Ponieważ @lru_cache używa słowników do buforowania wyników, wszystkie parametry funkcji muszą być możliwe do skrótu, aby pamięć podręczna działała.

Oficjalne dokumenty Pythona dla @lru_cache . @lru_cache został dodany w 3.2.

cmp_to_key

Python zmienił metody sortowania, aby zaakceptować funkcję klucza. Funkcje te przyjmują wartość i zwracają klucz, który służy do sortowania tablic.

Stare funkcje porównania przyjmowały dwie wartości i zwracały -1, 0 lub +1, jeśli pierwszy argument jest odpowiednio mały, równy lub większy niż drugi argument. Jest to niezgodne z nową funkcją klucza.

Właśnie tam pojawia się functools.cmp_to_key :

>>> import functools
>>> import locale
>>> sorted(["A", "S", "F", "D"], key=functools.cmp_to_key(locale.strcoll))
['A', 'D', 'F', 'S']

Przykład wzięty i zaadaptowany z dokumentacji standardowej biblioteki Python .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow