Поиск…


частичный

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 .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow