Модуль functools

Введение

Примеры

  • 2

    частичный

    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 удобна в тех случаях , когда данные поступают в виде потока , и мы не можем передать более одного аргумента.

  • 1

    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.

  • 1

    уменьшить

    В Python 3.x, то reduce функция уже пояснялось здесь была удалена из встроенных модулей и теперь должны быть импортированы из functools .

     from functools import reduce
    def factorial(n):
        return reduce(lambda a, b: (a*b), range(1, n+1))
    
     
  • 2

    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.

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

Синтаксис

Параметры

Примечания