Введение
Примеры
частичный
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()__
, 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(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
имеет два аргумента
maxsize
: Количество вызовов , чтобы сэкономить. Когда число уникальных вызовов превышаетmaxsize
, кэш LRU удалит наименее недавно использованные вызовы.typed
(добавлен в 3.3): Флаг для определения , если эквивалентные аргументы различных типов принадлежат к разным записям кэша (т.е. если3.0
и3
считаются разными аргументами)
Мы также можем увидеть статистику кеша:
>>> fib.cache_info()
CacheInfo(hits=13, misses=16, maxsize=None, currsize=16)
Примечание: Так как @lru_cache
использует словари для кэширования результатов, все параметры функции должны быть hashable для кэша работать.
Официальные документы 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 стандартной библиотеки .