Buscar..


parcial

La función partial crea una aplicación de función parcial desde otra función. Se utiliza para vincular valores a algunos de los argumentos de la función (o argumentos de palabras clave) y producir una llamada sin los argumentos ya definidos.

>>> from functools import partial
>>> unhex = partial(int, base=16)
>>> unhex.__doc__ = 'Convert base16 string to int'
>>> unhex('ca11ab1e')
3390155550

partial() , como su nombre indica, permite una evaluación parcial de una función. Veamos el siguiente ejemplo:

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

Cuando se crea g , f , que toma cuatro argumentos ( a, b, c, x ), también se evalúa parcialmente para los primeros tres argumentos, a, b, c, Evaluación de f se completa cuando g es llamado, g(2) , que pasa el cuarto argumento a f .

Una forma de pensar en partial es un registro de desplazamiento; empujando en un argumento en el momento en alguna función. partial es útil para los casos en que los datos entran como flujo y no podemos pasar más de un argumento.

ordenamiento total

Cuando queremos crear una clase ordenable, normalmente necesitamos definir los métodos __eq()__ , __lt__() , __le__() , __gt__() y __ge__() .

El decorador de total_ordering , aplicado a una clase, permite la definición de __eq__() y solo uno entre __lt__() , __le__() , __gt__() y __ge__() , y aún permite todas las operaciones de ordenamiento en la clase.

@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))

El decorador utiliza una composición de los métodos proporcionados y las operaciones algebraicas para derivar los otros métodos de comparación. Por ejemplo, si definimos __lt__() y __eq()__ y queremos derivar __gt__() , simplemente podemos verificar not __lt__() and not __eq()__ .

Nota : la función total_ordering solo está disponible desde Python 2.7.

reducir

En Python 3.x, la función de reduce ya explicada aquí se ha eliminado de las funciones integradas y ahora debe importarse desde functools .

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

lru_cache

El decorador @lru_cache se puede usar para envolver una función costosa y de uso intensivo de computación con un caché de uso menos reciente . Esto permite que las llamadas de función se memoricen, de modo que las llamadas futuras con los mismos parámetros puedan retornar instantáneamente en lugar de tener que volver a calcularse.

@lru_cache(maxsize=None)  # Boundless cache
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

>>> fibonacci(15)

En el ejemplo anterior, el valor de fibonacci(3) solo se calcula una vez, mientras que si fibonacci no tuviera un caché LRU, fibonacci(3) se habría calculado más de 230 veces. Por lo tanto, @lru_cache es especialmente bueno para funciones recursivas o programación dinámica, donde una función costosa podría llamarse varias veces con los mismos parámetros exactos.

@lru_cache tiene dos argumentos

  • maxsize : Número de llamadas a guardar. Cuando el número de llamadas únicas supera el maxsize , el caché LRU eliminará las llamadas menos utilizadas recientemente.
  • typed (agregado en 3.3): marca para determinar si los argumentos equivalentes de diferentes tipos pertenecen a diferentes registros de caché (es decir, si 3.0 y 3 cuentan como argumentos diferentes)

Podemos ver las estadísticas de caché también:

>>> fib.cache_info()
CacheInfo(hits=13, misses=16, maxsize=None, currsize=16)

NOTA : Ya que @lru_cache usa los diccionarios para almacenar en caché los resultados, todos los parámetros para la función deben estar habilitados para que la caché funcione.

Documentos oficiales de Python para @lru_cache . @lru_cache fue agregado en 3.2.

cmp_to_key

Python cambió sus métodos de clasificación para aceptar una función clave. Esas funciones toman un valor y devuelven una clave que se usa para ordenar las matrices.

Las antiguas funciones de comparación utilizadas para tomar dos valores y devolver -1, 0 o +1 si el primer argumento es pequeño, igual o mayor que el segundo argumento, respectivamente. Esto es incompatible con la nueva función clave.

Ahí es donde entra functools.cmp_to_key :

>>> import functools
>>> import locale
>>> sorted(["A", "S", "F", "D"], key=functools.cmp_to_key(locale.strcoll))
['A', 'D', 'F', 'S']

Ejemplo tomado y adaptado de la documentación de la biblioteca estándar de Python .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow