Python之functools库
functools库用于高阶函数,指那些作用于函数或者返回其他函数的函数
functools提供方法如下:
cmp_to_key | 将一个比较函数转换关键字函数 |
partial | 针对函数起作用,并且是部分的 |
reduce | 与python内置的reduce函数功能一样 |
total_ordering | 在类装饰器中按照缺失顺序填充方法 |
update_wrapper | 更新一个包裹函数,使其看起来更像被包裹的函数 |
wraps | 可用作一个装饰器,简化调用update_wrapper过程 |
cmp_to_key
将老式的比较函数转换为关键字函数,与接收key function的函数一起使用,比如sorted(iterator[,key,[,reverse]])
注:Python3.0中不支持比较函数
def fun(a, b):
return a[1] - b[1] #不明白这个位置为什么不能用> from functools import cmp_to_key
l11=[('b',2),('a',1),('c',3),('d',4)]
l2 = sorted(l11, key=cmp_to_key(fun))
print (l2) from operator import itemgetter
l3 = sorted(l11, key=itemgetter(1))
print (l3) >>> [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
partial
functools.partial(func,*args, **dwds),函数装饰器,返回一个新的partial对象
作用:当一个函数func可以接收很多参数,而某一次使用只需要更改其中的一部分参数,其他的参数都保持不变时,partial对象就可以将这些不变的对象冻结起来,这样调用partial对象时传入未冻结的参数,partial对象调用func时连同已经被冻结的参数一同传给func函数,从而可以简化调用过程。
#coding = utf-8 from functools import partial
def fun(arg1, arg2,arg3,arg4):
return arg1+arg2+arg3+arg4 #比如参数arg1, arg2,arg3一直保持不变,可以使用
#partial对象将这些不变的参数冻结起来
nochangeparm = partial(fun,1,2,3)
print (nochangeparm(4)) >>> 10
关于偏函数的更多详细知识可以参考:http://blog.csdn.net/appleyk/article/details/77609114
total_ordering
这是一个类装饰器,给定一个类,这个类定义了一个或者多个比较排序方法,这个类装饰器将会补充其他的比较方法,减少了自己定义所有方法时的工作量
被修饰的类必须提供__eq__()方法和__lt__(), __le__(),__gt__(),__ge__()中的至少一个
#coding = utf-8 from functools import total_ordering @total_ordering
class test:
def __init__(self,num):
self.num = num def __eq__(self,object):
return (self.num == object.num) def __lt__(self,object):
return (self.num < object.num) print (test.__dict__)
未使用@total_ordering输出:
使用@total_ordering输出:
update_wrapper
更新一个包裹(wrapper)函数,使其看起来更像被包裹(wrapped)的函数。
可选的参数指定了被包裹函数的哪些属性直接赋值给包裹函数的对应属性,同时包裹函数的哪些属性要更新而不是直接接受被包裹函数的对应属性,参数assigned的默认值对应于模块级常量WRAPPER_ASSIGNMENTS(默认地将被包裹函数的 __name__, __module__,和 __doc__ 属性赋值给包裹函数),参数updated的默认值对应于模块级常量WRAPPER_UPDATES(默认更新wrapper函数的 __dict__ 属性)。
这个函数的主要用途是在一个装饰器中,原函数会被装饰(包裹),装饰器函数会返回一个wrapper函数,如果装饰器返回的这个wrapper函数没有被更新,那么它的一些元数据更多的是反映wrapper函数定义的特征,无法反映wrapped函数的特性。
wraps
这个函数可用作一个装饰器,简化调用update_wrapper的过程,调用这个函数等价于调用partial(update_wrapper, wrapped = wrapped, assigned = assigned,updated = updated)。
#coding = utf-8 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()
print (example.__name__)
print (example.__doc__)
未使用@wraps前输出:
使用@wraps后输出
Python之functools库的更多相关文章
- yum安装的时候报错,关于python的函数库
我在执行yum -y install nc命令的时候出现如下报错 There was a problem importing one of the Python modulesrequired to ...
- python面试题库——1Python基础篇
第一部分 Python基础篇(80题) 为什么学习Python? 语言本身简洁,优美,功能超级强大,跨平台,从桌面应用,web开发,自动化测试运维,爬虫,人工智能,大数据处理都能做 Python和Ja ...
- Python的常用库
读者您好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们是: Requests.Kenneth Reitz写的最富盛名的http库.每个Python程序员都 ...
- Python底层socket库
Python底层socket库将Unix关于网络通信的系统调用对象化处理,是底层函数的高级封装,socket()函数返回一个套接字,它的方法实现了各种套接字系统调用.read与write与Python ...
- 【C++实现python字符串函数库】strip、lstrip、rstrip方法
[C++实现python字符串函数库]strip.lstrip.rstrip方法 这三个方法用于删除字符串首尾处指定的字符,默认删除空白符(包括'\n', '\r', '\t', ' '). s.st ...
- 【C++实现python字符串函数库】二:字符串匹配函数startswith与endswith
[C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...
- 【C++实现python字符串函数库】一:分割函数:split、rsplit
[C++实现python字符串函数库]split()与rsplit()方法 前言 本系列文章将介绍python提供的字符串函数,并尝试使用C++来实现这些函数.这些C++函数在这里做单独的分析,最后我 ...
- python使用cookielib库示例分享
Python中cookielib库(python3中为http.cookiejar)为存储和管理cookie提供客户端支持,下面是使用示例 该模块主要功能是提供可存储cookie的对象.使用此模块捕获 ...
- Python virtualenv安装库报错SSL: CERTIFICATE_VERIFY_FAILED
Python virtualenv安装库报错SSL: CERTIFICATE_VERIFY_FAILED 问题描述 使用pip按照virtualenv报错,如下: pip install virtua ...
随机推荐
- Java并发之CyclicBarria的使用(二)
Java并发之CyclicBarria的使用(二) 一.简介 之前借助于其他大神写过一篇关于CyclicBarria用法的博文,但是内心总是感觉丝丝的愧疚,因为笔者喜欢原创,而不喜欢去转载一些其他的文 ...
- 【Flask】Flask-Migrate基本使用
# flask_migrate笔记:在实际的开发环境中,经常会发生数据库修改的行为.一般我们修改数据库不会直接手动的去修改,而是去修改ORM对应的模型,然后再把模型映射到数据库中.这时候如果有一个工具 ...
- Collection与Collections、ArrayList和Vector、HashMap和Hashtable(面试常用)
Collections与Collection 1. Collections是java.util下的类,它包含有各种有关集合操作的静态方法2. Collection是java.util下的接口,它是各种 ...
- 20162326 齐力锋 2016-2017-2 《程序设计与数据结构》 MySort.java 实验博客
实验代码学习编程中的问题及解决方法 代码运行成功截图 首次代码运行出现的问题截图 问题1:无法从静态上下文中引用非静态方法 问题1解决方法及思考: split方法是非静态方法,需要借助对象来调用.我查 ...
- django使用migrations迁移版本和数据库中报错解决方案
1.到数据库表django_migrations中查看app中看看app列 2.到项目对应的app模块中打开migrations文件查看生成的文件与数据库app列中的是不是一样 3.找到哪里不一致的文 ...
- Java 四大作用域总结
一.ServletContext 1.生命周期:当Web应用被加载进容器时创建代表整个web应用的ServletContext对象,当服务器关闭或Web应用被移除时,ServletContext对象跟 ...
- spring security结合数据库验证用户-XML配置方式
之前的用户信息我们都是使用的内存用户,测试例子可以,实际中使用肯定不行,需要结合数据库进行验证用户.这就是本节的重点: 项目目录如下: 在之前的项目中的依赖中添加两个依赖: <dependen ...
- 文件(1)--File
File简介 Java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录.File类只用于表示文件(目录)的信息(名称.大小等),不能对文件的内容进行 ...
- Bellman-Ford算法优化
2017-07-27 16:02:48 writer:pprp 在BEllman-Ford算法中,其最外层的循环的迭代次数为n-1,如果不存在负权回路,需要迭代的次数是远远小于n-1; 如果在某一次迭 ...
- PAT1073. Scientific Notation (20)
#include <iostream> using namespace std; string a; int expo; int dotPos; int expoPos; int i; i ...