Python Language
Модуль Functools
Поиск…
частичный
partial
функция создает приложение частичной функции из другой функции. Он используется для привязки значений к некоторым аргументам функции (или аргументам по ключевым словам) и создает вызываемый без уже определенных аргументов.
>>> from functools import partial
>>> unhex = partial(int, base=16)
>>> unhex.__doc__ = 'Convert base16 string to int'
>>> unhex('ca11ab1e')
3390155550
partial()
, как следует из названия, допускает частичную оценку функции. Давайте посмотрим на следующий пример:
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
Когда g
создается, f
, который принимает четыре аргумента ( a, b, c, x
), также частично оценивается для первых трех аргументов, a, b, c,
Оценка f
завершается , когда g
называется, g(2)
, который проходит четвертый аргумент f
.
Один из способов думать о partial
- это регистр сдвига; нажав один аргумент в то время на некоторую функцию. partial
подходит для случаев, когда данные поступают как поток, и мы не можем передавать более одного аргумента.
total_ordering
Когда мы хотим создать упорядочиваемый класс, обычно нам нужно определить методы __eq()__
, __lt__()
, __le__()
, __gt__()
и __ge__()
.
Декоратор total_ordering
, применяемый к классу, допускает определение __eq__()
и только одно из __lt__()
, __le__()
, __gt__()
и __ge__()
и все еще допускает все операции упорядочения в классе.
@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))
Декоратор использует состав предоставленных методов и алгебраических операций для получения других методов сравнения. Например, если мы определили __lt__()
и __eq()__
и хотим вывести __gt__()
, мы можем просто проверить not __lt__() and not __eq()__
.
Примечание . Функция total_ordering
доступна только с Python 2.7.
уменьшить
В Python 3.x функция reduce
уже объясненная здесь , была удалена из встроенных модулей и теперь должна быть импортирована из functools
.
from functools import reduce
def factorial(n):
return reduce(lambda a, b: (a*b), range(1, n+1))
lru_cache
Декоратор @lru_cache
можно использовать для @lru_cache
дорогостоящей, вычислительно-интенсивной функции с использованием кеша, используемого в последнее время . Это позволяет запоминать вызовы функций, так что будущие вызовы с одинаковыми параметрами могут мгновенно возвращаться, а не быть перепрограммированными.
@lru_cache(maxsize=None) # Boundless cache
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
>>> fibonacci(15)
В приведенном выше примере значение fibonacci(3)
вычисляется только один раз, тогда как если у fibonacci
не было кеша LRU, то fibonacci(3)
были бы вычислены в 230 раз. Следовательно, @lru_cache
особенно @lru_cache
для рекурсивных функций или динамического программирования, где дорогостоящую функцию можно вызывать несколько раз с одинаковыми точными параметрами.
@lru_cache
имеет два аргумента
-
maxsize
: количество вызовов для сохранения. Когда количество уникальных вызовов превышаетmaxsize
, кеш LRU удалит наименее недавно используемые вызовы. -
typed
(добавлен в 3.3): Флаг для определения , если эквивалентные аргументы различных типов принадлежат к разным записям кэша (т.е. если3.0
и3
считаются разными аргументами)
Мы также видим статистику кеша:
>>> fib.cache_info()
CacheInfo(hits=13, misses=16, maxsize=None, currsize=16)
ПРИМЕЧАНИЕ . Поскольку @lru_cache
использует словари для кэширования результатов, все параметры для этой функции должны быть хешируемыми для работы кеша.
Официальные документы Python для @lru_cache
. @lru_cache
добавлен в 3.2.
cmp_to_key
Python изменил методы сортировки, чтобы принять ключевую функцию. Эти функции принимают значение и возвращают ключ, который используется для сортировки массивов.
Старые функции сравнения, используемые для принятия двух значений и возврата -1, 0 или +1, если первый аргумент мал, равен или больше второго аргумента соответственно. Это несовместимо с новой ключевой функцией.
Вот где functools.cmp_to_key
входит:
>>> import functools
>>> import locale
>>> sorted(["A", "S", "F", "D"], key=functools.cmp_to_key(locale.strcoll))
['A', 'D', 'F', 'S']
Пример, взятый и адаптированный из документации стандартной библиотеки Python .