当前位置: 首页 > 编程笔记 >

Python functools模块学习总结

龚盛
2023-03-14
本文向大家介绍Python functools模块学习总结,包括了Python functools模块学习总结的使用技巧和注意事项,需要的朋友参考一下

文档 地址

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学习笔记之os模块使用总结,包括了Python学习笔记之os模块使用总结的使用技巧和注意事项,需要的朋友参考一下

  • 本文向大家介绍python模块smtplib学习,包括了python模块smtplib学习的使用技巧和注意事项,需要的朋友参考一下 python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。 smtp协议的基本命令包括:     HELO 向服务器标识用户身份     MAIL 初始化邮件传输 mail from:     RCPT 标识单个的邮件接收人;常

  • 本文向大家介绍学习Node.js模块机制,包括了学习Node.js模块机制的使用技巧和注意事项,需要的朋友参考一下 一、CommonJS的模块规范 Node与浏览器以及 W3C组织、CommonJS组织、ECMAScript之间的关系 Node借鉴CommonJS的Modules规范实现了一套模块系统,所以先来看看CommonJS的模块规范。 CommonJS对模块的定义十分简单,主要分为模块引用

  • 目标 建立一个 lesson2 项目,在其中编写代码。 当在浏览器中访问 http://localhost:3000/?q=alsotang 时,输出 alsotang 的 md5 值,即 bdd5e57b5c0040f9dc23d430846e68a3。 挑战 访问 http://localhost:3000/?q=alsotang 时,输出 alsotang 的 sha1 值,即 e3c766

  • Python 是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。

  • 本文向大家介绍NodeJS学习笔记之MongoDB模块,包括了NodeJS学习笔记之MongoDB模块的使用技巧和注意事项,需要的朋友参考一下 一,开篇分析 这篇属于扩展知识篇,因为在下面的文章中会用到数据库操作,所以今天就来说说它(Mongodb模块)。 (1),简介  MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。  Mo

  • 本文向大家介绍JQuery学习总结【二】,包括了JQuery学习总结【二】的使用技巧和注意事项,需要的朋友参考一下 一:JQuery知识点 *:JQuery的dom操作 *:动态创建dom节点 比如动态创建表格等,在js里面进行完成。 *删除节点 这里面的删除就是将其放在了一个地方,并不是真的删除,之后可以使用。 *:document方法 1:.val()可以获取到文本框里面的值,若括号里面有值则

  • 有四种类型的znode: PERSISTENT-持久化目录节点 客户端与zookeeper断开连接后,该节点依旧存在 PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点 客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号 EPHEMERAL-临时目录节点 客户端与zookeeper断开连接后,该节点被删除 EPHEMERAL_SEQ