Python标准库functools

functools模块提供了高阶函数功能:函数可以作为或者返回其他函数。通常, 任何可调用对象可以被视为在本模块的函数。

高阶函数是指将函数作为传参或返回值的函数,即functools提供了一些工具,用来处理函数。包含的方法主要有cmp_to_key, partial, reduce, total_ordering, update_wrapper, wraps。

cmp_to_key

cmp_to_key的作用就是讲cmp函数转化为key函数。这里有两个概念:

比较函数是任何一个可调用的函数,且包含两个参数,对参数进行比较,如果小于返回负数,等于返回0,大于返回正数。
关键函数是一种可调用函数。接受一个参数,返回另一个表明其在期望序列中的位置的值。

cmp_to_key应用在需要key函数作为参数的函数中,比如sorted, min, max等。我们用sorted函数举例:

from functools import cmp_to_key
s1 = sorted(range(5)) # [0, 1, 2, 3, 4]
s2 = sorted(range(5), cmp=lambda x, y: x % 3 - y % 3)
s3 = sorted(range(5), key=lambda x: x % 3
s4 = sorted(range(5), key=cmp_to_key(lambda x, y: x % 3 - y % 3))

上面的例子中,s1是默认排序;s2,s3,s4是等效的,将0-4按照模3进行比较。s2指定了cmp函数,s3指定了key函数,s4将s2的cmp函数转换为key函数。

partial

partial是偏函数应用,将函数的部分参数固定到新的函数中。一般实现:

def add(x, y):
    return x + y

def add2(y):
    return add(2, y)

add2(3) # 5

上面的例子是将add函数的一个参数x=2固定到add2中。这个例子可以通过partial实现:

def add(x, y):
    return x + y

add2 = functools.partial(add, 2)

add2(3) # 5

reduce

就是python2 内建函数reduce。在python3中reduce被移除内建函数,用functools.reduce可以向前兼容。

total_ordering

total_ordering 同样是 Python 2.7 中新增函数,用于简化比较函数的写法。如果你已经定义了 __eq__ 方法,以及 __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()))
dir(Student) # ['__doc__', '__eq__', '__ge__', '__gt__', '__le__', '__lt__', '__module__']

warps

之前了解过装饰器函数,装饰器会有一个副作用,会把原函数的名字覆盖掉。

def outer(fun):
    def inner():
        pass
    return inner

@outer
def fun():
    pass

f = fun
f.__name__ # inner

wraps用来解决这个问题。

def outer(fun):
    @wraps
    def inner():
        pass
    return inner

@outer
def fun():
    pass

f = fun
f.__name__ # fun

除了__name__外,wraps还能修改的属性可以通过functools.WRAPPER_ASSIGNMENTS查询。

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

update_wrapper

update_wrapper功能与wraps类似,后者可以看做前者的特化,可以理解为

wraps = partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)

参考

http://python.usyiyi.cn/python_278/library/index.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 1 functools函数 functools模块用于高阶函数:作用与或者返回其它函数的函数。一般来说,对于该模块...
    lakerszhy阅读 9,972评论 0 7
  • Python进阶框架 希望大家喜欢,点赞哦首先感谢廖雪峰老师对于该课程的讲解 一、函数式编程 1.1 函数式编程简...
    Gaolex阅读 5,488评论 6 53
  • 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确...
    齐天大圣李圣杰阅读 1,522评论 0 2
  • 教程总纲:http://www.runoob.com/python/python-tutorial.html 进阶...
    健康哥哥阅读 2,009评论 1 3
  • 产后肥胖是很多妈妈的噩梦,每次看到镜子里臃肿变形的身材,都会感到十分抑郁、自卑。减肥就成了妈妈们的“终身大事”,很...
    真先生阅读 214评论 0 0