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实现检测服务器是否可以ping通的2种方法
Jan 01 Python
python实现数据导出到excel的示例--普通格式
May 03 Python
Flask框架URL管理操作示例【基于@app.route】
Jul 23 Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 Python
python @classmethod 的使用场合详解
Aug 23 Python
Django重设Admin密码过程解析
Feb 10 Python
Python Numpy 控制台完全输出ndarray的实现
Feb 19 Python
python matplotlib.pyplot.plot()参数用法
Apr 14 Python
Python绘制动态水球图过程详解
Jun 03 Python
在python中list作函数形参,防止被实参修改的实现方法
Jun 05 Python
Python实现查找数据库最接近的数据
Jun 08 Python
关于Kotlin中SAM转换的那些事
Sep 15 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
PHP 冒泡排序算法的实现代码
2010/08/08 PHP
PHP文件大小格式化函数合集
2014/03/10 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
解决Laravel无法使用COOKIE和SESSION的问题
2019/10/16 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
Js实现滚动变色的文字效果
2014/06/16 Javascript
JS实现单击输入框弹出选择框效果完整实例
2015/12/14 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
AngularJS 异步解决实现方法
2017/06/12 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
js中switch语句的学习笔记
2020/03/25 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
连接Python程序与MySQL的教程
2015/04/29 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
Python 类的特殊成员解析
2018/06/20 Python
用Python逐行分析文件方法
2019/01/28 Python
python的re模块使用方法详解
2019/07/26 Python
django admin.py 外键,反向查询的实例
2019/07/26 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
Python过滤掉numpy.array中非nan数据实例
2020/06/08 Python
一篇文章教你用python画动态爱心表白
2020/11/22 Python
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
洗车工岗位职责
2014/03/15 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
2015年医院后勤工作总结
2015/05/20 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python