Python functools模块学习总结


Posted in Python onMay 09, 2015

文档 地址

functools.partial

作用:

functools.partial 通过包装手法,允许我们 "重新定义" 函数签名

用一些默认参数包装一个可调用对象,返回结果是可调用对象,并且可以像原始对象一样对待

冻结部分函数位置函数或关键字参数,简化函数,更少更灵活的函数参数调用

#args/keywords 调用partial时参数

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

    def newfunc(*fargs, **fkeywords):

        newkeywords = keywords.copy()

        newkeywords.update(fkeywords)

        return func(*(args + fargs), **newkeywords) #合并,调用原始函数,此时用了partial的参数

    newfunc.func = func

    newfunc.args = args

    newfunc.keywords = keywords

    return newfunc

声明:
urlunquote = functools.partial(urlunquote, encoding='latin1')

当调用 urlunquote(args, *kargs)

相当于 urlunquote(args, *kargs, encoding='latin1')

E.g:

import functools
def add(a, b):

    return a + b
add(4, 2)

6
plus3 = functools.partial(add, 3)

plus5 = functools.partial(add, 5)
plus3(4)

7

plus3(7)

10
plus5(10)

15

应用:

典型的,函数在执行时,要带上所有必要的参数进行调用。

然后,有时参数可以在函数被调用之前提前获知。

这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用。

functool.update_wrapper

默认partial对象没有__name__和__doc__, 这种情况下,对于装饰器函数非常难以debug.使用update_wrapper(),从原始对象拷贝或加入现有partial对象

它可以把被封装函数的__name__、module、__doc__和 __dict__都复制到封装函数去(模块级别常量WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES)

>>> functools.WRAPPER_ASSIGNMENTS

('__module__', '__name__', '__doc__')

>>> functools.WRAPPER_UPDATES

('__dict__',)

这个函数主要用在装饰器函数中,装饰器返回函数反射得到的是包装函数的函数定义而不是原始函数定义
#!/usr/bin/env python

# encoding: utf-8
def wrap(func):

    def call_it(*args, **kwargs):

        """wrap func: call_it"""

        print 'before call'

        return func(*args, **kwargs)

    return call_it
@wrap

def hello():

    """say hello"""

    print 'hello world'
from functools import update_wrapper

def wrap2(func):

    def call_it(*args, **kwargs):

        """wrap func: call_it2"""

        print 'before call'

        return func(*args, **kwargs)

    return update_wrapper(call_it, func)
@wrap2

def hello2():

    """test hello"""

    print 'hello world2'
if __name__ == '__main__':

    hello()

    print hello.__name__

    print hello.__doc__
    print

    hello2()

    print hello2.__name__

    print hello2.__doc__

得到结果:

before call

hello world

call_it

wrap func: call_it
before call

hello world2

hello2

test hello

functool.wraps

调用函数装饰器partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)的简写

from functools import wraps

def wrap3(func):

    @wraps(func)

    def call_it(*args, **kwargs):

        """wrap func: call_it2"""

        print 'before call'

        return func(*args, **kwargs)

    return call_it
@wrap3

def hello3():

    """test hello 3"""

    print 'hello world3'

结果
before call

hello world3

hello3

test hello 3

functools.reduce

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

等同于内置函数reduce()

用这个的原因是使代码更兼容(python3)

functools.cmp_to_key

functools.cmp_to_key(func)
将老式鼻尖函数转换成key函数,用在接受key函数的方法中(such as sorted(), min(), max(), heapq.nlargest(), heapq.nsmallest(), itertools.groupby())

一个比较函数,接收两个参数,小于,返回负数,等于,返回0,大于返回整数

key函数,接收一个参数,返回一个表明该参数在期望序列中的位置

例如:

sorted(iterable, key=cmp_to_key(locale.strcoll))  # locale-aware sort order

functools.total_ordering

functools.total_ordering(cls)

这个装饰器是在python2.7的时候加上的,它是针对某个类如果定义了__lt__、le、gt、__ge__这些方法中的至少一个,使用该装饰器,则会自动的把其他几个比较函数也实现在该类中
@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()))

print dir(Student)

得到
['__doc__', '__eq__', '__ge__', '__gt__', '__le__', '__lt__', '__module__']
Python 相关文章推荐
python实现在windows下操作word的方法
Apr 28 Python
Python中shutil模块的常用文件操作函数用法示例
Jul 05 Python
Linux系统(CentOS)下python2.7.10安装
Sep 26 Python
Python基础教程之异常详解
Jan 10 Python
Python不同目录间进行模块调用的实现方法
Jan 29 Python
在Python中表示一个对象的方法
Jun 25 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
May 22 Python
keras小技巧——获取某一个网络层的输出方式
May 23 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
Jul 14 Python
浅析Python 序列化与反序列化
Aug 05 Python
Python urllib库如何添加headers过程解析
Oct 05 Python
Python Socket多线程并发原理及实现
Dec 11 Python
Python浅拷贝与深拷贝用法实例
May 09 #Python
九步学会Python装饰器
May 09 #Python
Python类属性与实例属性用法分析
May 09 #Python
python回调函数用法实例分析
May 09 #Python
python类和函数中使用静态变量的方法
May 09 #Python
Python实用日期时间处理方法汇总
May 09 #Python
python fabric使用笔记
May 09 #Python
You might like
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
PHP循环获取GET和POST值的代码
2008/04/09 PHP
PHP 伪静态隐藏传递参数名的四种方法
2010/02/22 PHP
基于curl数据采集之单页面采集函数get_html的使用
2013/04/28 PHP
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
2014/08/21 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
[对联广告] JS脚本类
2006/08/27 Javascript
JScript中的&quot;this&quot;关键字使用方式补充材料
2007/03/08 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
2013/06/06 Javascript
浅谈js数组和splice的用法
2016/12/04 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
javascript性能优化之分时函数的介绍
2018/03/28 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
2019/07/23 Javascript
vue-model实现简易计算器
2020/08/17 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
Python基础语法(Python基础知识点)
2016/02/28 Python
python判断一个集合是否为另一个集合的子集方法
2018/05/04 Python
Python爬虫包BeautifulSoup简介与安装(一)
2018/06/17 Python
python3实现高效的端口扫描
2019/08/31 Python
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
Java基础类库面试题
2013/09/04 面试题
退休感言
2014/01/28 职场文书
恶搞卫生巾广告词
2014/03/18 职场文书
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书
Python OpenCV 图像平移的实现示例
2021/06/04 Python
opencv检测动态物体的实现
2021/07/21 Python
Python Pygame实战在打砖块游戏的实现
2022/03/17 Python