Python的functools模块使用总结

 2258

本篇文章给大家带来了关于Python的相关知识,主要介绍了Python的functools模块使用及说明,具有很好的参考价值,下面一起来看一下,希望对大家有帮助。

Python的functools模块使用总结

partial

用于创建一个偏函数,将默认参数包装一个可调用对象,返回结果也是可调用对象。

偏函数可以固定住原函数的部分参数,从而在调用时更简单。

  1. from functools import partial
  2.  
  3. int2 = partial(int, base=8)
  4. print(int2('123'))
  5. # 83

update_wrapper

使用 partial 包装的函数是没有__name__和__doc__属性的。

update_wrapper 作用:将被包装函数的__name__等属性,拷贝到新的函数中去。

  1. from functools import update_wrapper
  2. def wrap2(func):
  3.     def inner(*args):
  4.         return func(*args)
  5.     return update_wrapper(inner, func)
  6.  
  7. @wrap2
  8. def demo():
  9.     print('hello world')
  10.  
  11. print(demo.__name__)
  12. # demo

wraps

warps 函数是为了在装饰器拷贝被装饰函数的__name__。

就是在update_wrapper上进行一个包装

  1. from functools import wraps
  2. def wrap1(func):
  3.     @wraps(func)    # 去掉就会返回inner
  4.     def inner(*args):
  5.         print(func.__name__)
  6.         return func(*args)
  7.     return inner
  8.  
  9. @wrap1
  10. def demo():
  11.     print('hello world')
  12.  
  13. print(demo.__name__)
  14. # demo

reduce

在 Python2 中等同于内建函数 reduce

函数的作用是将一个序列归纳为一个输出

  1. reduce(function, sequence, startValue)
  2.  
  3. from functools import reduce
  4.  
  5. = range(1,50)
  6. print(reduce(lambda x,y:x+y, l))
  7. # 1225

cmp_to_key

在 list.sort 和 内建函数 sorted 中都有一个 key 参数

  1. = ['hello','worl','ni']
  2. x.sort(key=len)
  3. print(x)
  4. # ['ni', 'worl', 'hello']

Python3 之前还提供了cmp参数来比较两个元素

cmp_to_key 函数就是用来将老式的比较函数转化为 key 函数


lru_cache

允许我们将一个函数的返回值快速地缓存或取消缓存。

该装饰器用于缓存函数的调用结果,对于需要多次调用的函数,而且每次调用参数都相同,则可以用该装饰器缓存调用结果,从而加快程序运行。

该装饰器会将不同的调用结果缓存在内存中,因此需要注意内存占用问题。

  1. from functools import lru_cache
  2. @lru_cache(maxsize=30)  # maxsize参数告诉lru_cache缓存最近多少个返回值
  3. def fib(n):
  4.     if n < 2:
  5.         return n
  6.     return fib(n-1) + fib(n-2)
  7. print([fib(n) for n in range(10)])
  8. fib.cache_clear()   # 清空缓存

singledispatch

单分发器, Python3.4新增,用于实现泛型函数。

根据单一参数的类型来判断调用哪个函数。

  1. from functools import singledispatch
  2. @singledispatch
  3. def fun(text):
  4.     print('String:' + text)
  5.  
  6. @fun.register(int)
  7. def _(text):
  8.     print(text)
  9.  
  10. @fun.register(list)
  11. def _(text):
  12.     for k, v in enumerate(text):
  13.         print(k, v)
  14.  
  15. @fun.register(float)
  16. @fun.register(tuple)
  17. def _(text):
  18.     print('float, tuple')
  19. fun('i am is hubo')
  20. fun(123)
  21. fun(['a','b','c'])
  22. fun(1.23)
  23. print(fun.registry)    # 所有的泛型函数
  24. print(fun.registry[int])    # 获取int的泛型函数
  25. # String:i am is hubo
  26. # 123
  27. # 0 a
  28. # 1 b
  29. # 2 c
  30. # float, tuple
  31. # {<class 'object'>: <function fun at 0x106d10f28>, <class 'int'>: <function _ at 0x106f0b9d8>, <class 'list'>: <function _ at 0x106f0ba60>, <class 'tuple'>: <function _ at 0x106f0bb70>, <class 'float'>: <function _ at 0x106f0bb70>}
  32. # <function _ at 0x106f0b9d8>


本文网址:https://www.zztuku.com/index.php/detail-12819.html
站长图库 - Python的functools模块使用总结
申明:本文转载于《脚本之家》,如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐