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中使用next()方法操作文件的教程
May 24 Python
Python的Django框架安装全攻略
Jul 15 Python
python单例模式获取IP代理的方法详解
Sep 13 Python
python: 自动安装缺失库文件的方法
Oct 22 Python
利用python修改json文件的value方法
Dec 31 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
使用Python检测文章抄袭及去重算法原理解析
Jun 14 Python
PyQt5图形界面播放音乐的实例
Jun 17 Python
Python 函数list&amp;read&amp;seek详解
Aug 28 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
Jan 14 Python
使用matlab 判断两个矩阵是否相等的实例
May 11 Python
Python实现读取并写入Excel文件过程解析
May 27 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 xml实例 留言本
2009/03/20 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
2014/02/02 PHP
linux中cd命令使用详解
2015/01/08 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
2017/04/18 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
Javascript中Eval函数的使用
2010/03/23 Javascript
jQuery读取XML文件内容的方法
2015/03/09 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
AngularJS初始化静态模板详解
2016/01/14 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
[00:36]DOTA2上海特级锦标赛 LGD战队宣传片
2016/03/04 DOTA
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
解决Python requests 报错方法集锦
2017/03/19 Python
Python编程实现粒子群算法(PSO)详解
2017/11/13 Python
Python线性方程组求解运算示例
2018/01/17 Python
在cmd命令行里进入和退出Python程序的方法
2018/05/12 Python
Python递归实现打印多重列表代码
2020/02/27 Python
Python读写操作csv和excle文件代码实例
2020/03/16 Python
一文解决django 2.2与mysql兼容性问题
2020/07/15 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
求职信需要的五点内容
2014/02/01 职场文书
公司会计岗位职责
2014/02/13 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
2015年酒店服务员工作总结
2015/05/18 职场文书
2015年中职班主任工作总结
2015/05/25 职场文书
煤矿安全生产工作总结
2015/08/13 职场文书
上级领导检查欢迎词
2015/09/30 职场文书
python通过新建环境安装tfx的问题
2022/05/20 Python