Модуль 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()__ , 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 стандартной библиотеки .

Синтаксис

Параметры

Примечания