Python Language
Moduł Functools
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ń przekroczymaxsize
, 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. czy3.0
i3
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 .