原文:https://www.cnblogs.com/Security-Darren/p/4168310.html#t7

http://www.wklken.me/posts/2013/08/18/python-extra-functools.html------PYTHON-进阶-FUNCTOOLS模块小结

https://blog.csdn.net/Appleyk/article/details/77609114-----Python3学习(18)--偏函数(Partial)

该模块为高阶函数提供支持——作用于或返回函数的函数被称为高阶函数。在该模块看来,一切可调用的对象均可视为本模块中所说的“函数”。

目录

一、模块方法

该模块中定义了如下方法:

1.

functools.cmp_to_key(func)

将老式的比较函数(comparison function)转化为关键字函数(key function)。与接受key function的工具一同使用(如 sorted(), min(), max(), heapq.nlargest(), itertools.groupby())。该函数主要用来将程序转成 Python 3 格式的,因为 Python 3 中不支持比较函数。

比较函数是可调用的,接受两个参数,比较这两个参数并根据他们的大小关系返回负值、零或正值中的某一个。关键字函数也是可调用的,接受一个参数,同时返回一个可以用作排序关键字的值。

例如:

sorted(iterable, key=cmp_to_key(locale.strcoll))

2.

functools.total_ordering(cls)

这是一个类装饰器,给定一个类,这个类定义了一个或多个比较排序方法,这个类装饰器将会补充其余的比较方法,减少了自己定义所有比较方法时的工作量。

被修饰的类必须至少定义 __lt__(), __le__(), __gt__() 或 __ge__() 中的一个,同时,被修饰的类还应该提供 __eq__() 方法。

例如:

@total_ordering

class Student:

def __eq__(self, other):

return ((self.lastname.lower(), self.firstname.lower()) ==

(other.lastname.lower(), other.firstname.lower()))

def __lt__(self, other):

return ((self.lastname.lower(), self.firstname.lower()) <

(other.lastname.lower(), other.firstname.lower()))

3.

functools.reduce(function, iterable[, initializer])

和 reduce() 方法的作用相同,这里提供了向 Python 3 过渡的前向支持。

4.

functools.partial(func[,*args][, **keywords])

函数装饰器,返回一个新的 partial 对象,关于 partial 对象的介绍见下文。调用 partial 对象就和调用被修饰的函数 func 相同,只不过调用 partial 对象时传入的参数个数通常少于调用 func 时传入的参数个数。 当一个函数 func 可以接收很多参数,而某一次使用只需要更改其中的一部分参数,其他的某些参数都保持不变时, partial 对象就可以将这些不变的对象冻结起来,这样调用 partial 对象时传入未冻结的参数, partial 对象调用 func 时连同已经被冻结的参数一同传给 func 函数,从而简化了调用过程。

如果调用 partial 对象时提供了更多的参数,那么他们会被添加到 args 的后面,如果提供了更多的关键字参数,那么它们将扩展或覆写已经冻结的关键字参数

partial 对象的作用大抵如下:

def partial(func, *args, **keywords):

def newfunc(*fargs, **fkeywords):

newkeywords = keywords.copy()

newkeywords.update(fkeywords)

return func(*(args + fargs), **newkeywords)

newfunc.func = func

newfunc.args = args

newfunc.keywords = keywords

return newfunc

使用 partial 对象创建一个 base 参数始终为 2 的 int()

from functools import partial

basetwo = partial(int, base=2)

basetwo.__doc__ = 'Convert base 2 string to an int.'

basetwo('10010')

这个新的 partial 对象 basetwo 能够将二进制的参数转化为十进制的整型结果,在调用这个 partial 对象时只需要传入二进制的目标参数即可。

5.

functools.update_wrapper(wrapper, wrapped[, assigned][, updated])

更新一个包裹(wrapper)函数,使其看起来更像被包裹(wrapped)的函数。

可选的参数指定了被包裹函数的哪些属性直接赋值给包裹函数的对应属性,同时包裹函数的哪些属性要更新而不是直接接受被包裹函数的对应属性。参数 assigned 的默认值对应于模块级常量 WRAPPER_ASSIGNMENTS(默认地将被包裹函数的 __name__, __module__ 和 __doc__ 属性赋给包裹函数), 参数 updatedd  的默认值对应于模块级常量 WRAPPER_UPDATES (默认更新 wrapper 函数的 __dict__属性)。

这个函数的主要用途是在一个装饰器中,原函数会被装饰(包裹),装饰器函数会返回一个 wrapper 函数,如果装饰器返回的这个 wrapper 函数没有被更新,那么它的一些元数据更多的是反映 wrapper 函数定义时的特征,无法反映 wrapped 函数的特性。

6.

functools.wraps(wrapped[, assigned][, updated])

这个函数可以用作一个装饰器,简化调用上一个函数 update_wrapper 的过程。调用这个函数等价于调用  partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated) 。

例如:

>>> from functools import wraps

>>> def my_decorator(f):

... @wraps(f)

... def wrapper(*args, **kwds):

... print 'Calling decorated function'

... return f(*args, **kwds)

... return wrapper

...

>>> @my_decorator

... def example():

... """Docstring"""

... print 'Called example function'

...

>>> example()

Calling decorated function

Called example function

>>> example.__name__

'example'

>>> example.__doc__

'Docstring'

可以看到最终调用的 example() 函数是经过 @my_decorator 装饰的,装饰器的作用是接受一个被包裹函数作为参数,对其进行加工,返回一个包裹函数。代码使用 @functools.wraps 装饰将要返回的包裹函数 wrapper,使得他的 __name__, __doc__ 和 __module__ 属性与被装饰函数 examle()完全相同, 这样虽然最终调用的是经过装饰的 example() 函数,但是某些属性还是得到了维护。

如果在 @my_decorator 的定义中不使用 @functools.wraps 装饰包裹函数,那么最终 example.__name__ 将会变为 ‘wrapper’, 而 example.__doc__ 也会丢失。

partial对象

partial对象是调用partial()时创建的可调用对象,他们有三个只读的属性:

1.  partial.func

可调用或函数,调用partial对象时,会结合新的参数和关键字最终调用func。

2.  partial.args

默认为最左的位置参数,这些参数会被自动添加到所有调用partial对象时传入的参数前。也就是说在调用partial对象时不用传入这些参数即可,他们视为恒定的,从而自动添加到func的调用中。

3.  partial.keywords

当调用partial对象时提供的关键字参数。

partial对象在一些方面类似于函数对象:可调用,弱引用,可以拥有属性。但是也有一些关键的区别:

1.partial对象的 __name__ 和 __doc__ 属性不会自动创建;

2. 在类里定义的partial对象使用时更像静态方法,在实例的属性查询过程中不会转变成绑定方法(bound methods, 通过类的实例对象进行属性引用)。

python中functools_(转)Python——functools相关推荐

  1. python中什么是异常,python中异常处理,python异常处理,什么是异常?异常是一

    python中异常处理,python异常处理,什么是异常?异常是一 什么是异常? 异常是一个事件,该事件会在程序的执行中发生,影响程序的正常运行,一般情况下,在python无法正常处理程序时,就会发生 ...

  2. python中for循环-python中关于for循环的碎碎念

    为什么要挑战自己在代码里不写for loop?因为这样可以迫使你去使用比较高级.地道的语法或库.文中以python为例子,讲了不少大家其实在别人的代码里都见过.但自己很少用的语法. 这是一个挑战.我要 ...

  3. python中choicebox_学习python的第四天笔记

    26.032 异常处理 常用的异常警告语句: AssertionError:断言语句失败 AttributeError:访问的未知的对象属性,#例如f.dcp(),.dcp()是不存在的 IndexE ...

  4. python中if错误-Python中常见的异常处理

    异常和错误 part1:程序中难免出现错误,而错误分成两种 1. 语法错误(这种错误,根本过不了Python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 def ...

  5. 2!=5 or 0在python中是否正确-python数据分析第二版:numpy

    一:Numpy #数组和列表的效率问题,谁优谁劣 #1.循环遍历 importnumpy as npimporttime my_arr= np.arange(1000000) my_list= lis ...

  6. 2!=5 or 0在python中是否正确-python中的if判断语句

    判断(if)语句 目标 开发中的应用场景 if 语句体验 if 语句进阶 综合应用 01. 开发中的应用场景 生活中的判断几乎是无所不在的,我们每天都在做各种各样的选择,如果这样?如果那样?--  ...

  7. 2!=5 or 0在python中是否正确-python 中 and or

    在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值:而是,返回它们实际进行比较的值之一. 一.and: 在布尔上下文中从左到右演算表达式的值,如果布尔上下 ...

  8. python中if错误-python中的异常处理

    异常 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下 异常种类 在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同 ...

  9. python中语法错误-python冒号语法错误python中如何创建字典

    python字典定义 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ...

最新文章

  1. php实现简单验证码的功能
  2. 自定义Docker容器的 hostname
  3. [USACO06DEC]牛的野餐Cow Picnic DFS
  4. 第四范式受邀成为5G消息工作组成员
  5. Qt Creator编写代码
  6. 获取一个 Byte 的各个 Bit 值
  7. java中常用的String方法
  8. 中职计算机应用基础微课获奖视频,浅谈微课在中职计算机应用基础教学中的应用...
  9. 数据库工作笔记004---mysql对结果字段进行判断的函数_Case when等
  10. java 月度相减_java根据日期获取月龄,按照减法原理,先day相减,不够向month借;然后month相减,不够向year借;最后year相减。...
  11. ap_invoice_distributions_all到xla_ae_lines
  12. 数据库和python的结合_mysql数据库备份和python结合
  13. NOIP引水入城(dfs)
  14. 企业微信API使用基本教程
  15. access网格线方向微为垂直_设置ACCESS2010背景和网格线
  16. 电路交换与分组交换的区别
  17. 魔术师usm安装服务器系统,魔术师u盘一键装系统
  18. Ps怎么快速抠图白色背景?教你两招轻松搞定!
  19. 【SQL】练习题184道
  20. 英语--罗塞塔学习总结

热门文章

  1. 克隆一个 AI 替自己开会,爽吗?
  2. 华为发布近2万元折叠屏手机Mate Xs;iPhone 12或支持WiFi新标;Electron 6.1.8发布 | 极客头条...
  3. 面对疫情,AI 能做什么?
  4. 阿里乌镇大动作:平头哥开源 MCU 设计平台!
  5. 深度学习入门有多难?这篇带你零基础入行
  6. 从初级程序员逆袭为技术大牛,你需要懂这 10 项技术!
  7. iSPRINT:Google 最高能的创新加速课程,清华老师都来给点赞!
  8. 拿什么重建你,巴黎圣母院?
  9. 浪潮云海OS C位出道,融合开放基础设施呼之欲出
  10. 程序员如何帮助公司快速上市、获得分红?