Документация по Python

Модуль functools

В: Документация по Python

Введение

Примеры

частичный

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 стандартной библиотеки .

Синтаксис

Параметры

Примечания

Еще от кодкамп
Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.