文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python高阶函数functools模块如何使用

2023-07-05 16:48

关注

本篇内容主要讲解“python高阶函数functools模块如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python高阶函数functools模块如何使用”吧!

functools模块提供了一些常用的高阶函数(处理其他可调用对象/函数的特殊函数;以函数作为输入参数,返回也是函数)。

functools模块

functools模块中的高阶函数可基于已有函数定义新的函数:

reduce

reduce(function, iterable[, initializer])对一个可迭代数据集合中的所有数据进行累积。

# 累加reduce(lambda x,y:x+y, [1,2,3,4]) # 10# 逆序字符串reduce(lambda x,y:y+x, 'abcdefg') # 'gfedcba'

partial/partialmethod

partial用于"冻结"函数的部分参数,返回一个参数更少、使用更简单的函数对象。使用时,只需传入未冻结的参数即可。partialmethod用于处理类方法。

functools.partial(func[, *args][, **keywords])返回一个新的partial对象:

def add(a, b, note="add"):    result = a + b    print(f"{note} result: {result}")    return resultadd3 = functools.partial(add, 3)add5 = functools.partial(add, 5, note="partialed")print(add3(1)) # add result: 4print(add3(2, note="partial3")) # partial3 result: 5print(add5(3)) # partialed result: 8

partialmethod用于类中的方法

class Cell(object):    def __init__(self):        self._alive = False    @property    def alive(self):        return self._alive    def set_state(self, state):        self._alive = bool(state)    set_alive = functools.partialmethod(set_state, True)    set_dead = functools.partialmethod(set_state, False)c = Cell()print(c.alive)  # Falsec.set_alive()print(c.alive)  # True

wraps/update_wrapper

functools.update_wrapper(wrapper, wrapped [, assigned] [, updated])更新一个包裹(wrapper)函数,使其看起来更像被包裹(wrapped)的函数(即把 被封装函数的__name__、__module__、__doc__和 __dict__都复制到封装函数去。wraps是通过partial与update_wrapper实现的。

通常,经由被装饰(decorator)的函数会表现为另外一个函数了(函数名、说明等都变为了装饰器的);通过wraps函数可以消除装饰器的这些副作用。

def wrapper_decorator(func):    @functools.wraps(func) # 若是去掉此wraps,则被装饰的函数名称与说明都变为此函数的    def wrapper(*args, **kwargs):        """doc of decorator"""        print('in wrapper_decorator...')        return func(*args, **kwargs)    return wrapper@wrapper_decoratordef example():    """doc of example"""    print('in example function')example()# in wrapper_decorator...# in example functionprint(example.__name__, "; ", example.__doc__) # example ;  doc of example

singledispatch/singledispatchmethod

singledispatch将普通函数转换为泛型函数,而singledispatchmethod(3.8引入)将类方法转换为泛型函数:

dispatch使用:

# 缺省匹配类型,注册object类型(与后续注册类型都不匹配时使用)@functools.singledispatchdef show_dispatch(obj):    print(obj, type(obj), "dispatcher")# 匹配str字符串@show_dispatch.register(str)def _(text):    print(text, type(text), "str")# 匹配int@show_dispatch.register(int)def _(n):    print(n, type(n), "int")# 匹配元祖或者字典@show_dispatch.register(tuple)@show_dispatch.register(dict)def _(tup_dic):    print(tup_dic, type(tup_dic), "tuple/dict")### 打印注册的类型:# dict_keys([<class 'object'>, <class 'str'>, <class 'int'>, <class 'dict'>, <class 'tuple'>])print(show_dispatch.registry.keys())show_dispatch(1)show_dispatch("xx")show_dispatch([1])show_dispatch((1, 2, 3))show_dispatch({"a": "b"})# 1 <class 'int'> int# xx <class 'str'> str# [1] <class 'list'> dispatcher# (1, 2, 3) <class 'tuple'> tuple/dict# {'a': 'b'} <class 'dict'> tuple/dict

cmp_to_key

cmp_to_key()用来自定义排序规则,可将比较函数(comparison function)转化为关键字函数(key function):

test = [1, 3, 5, 2, 4]test.sort(key=functools.cmp_to_key(lambda x, y: 1 if x < y else -1))print(test) # [5, 4, 3, 2, 1]

total_ordering

是一个类装饰器,用于自动实现类的比较运算;类定义一个或者多个比较排序方法,类装饰器将会补充其余的比较方法。

被修饰的类必须至少定义 __lt__(), __le__(),__gt__(),__ge__()中的一个,以及__eq__()方法。

如,只需定义lt与eq方法,即可实现所有比较:

@functools.total_orderingclass Person:    def __init__(self, name, age):        self.name = name        self.age = age    def __lt__(self, other):        if isinstance(other, Person):            return self.age < other.age        else:            raise AttributeError("Incorrect attribute!")    def __eq__(self, other):        if isinstance(other, Person):            return self.age == other.age        else:            raise AttributeError("Incorrect attribute!")mike = Person("mike", 20)tom = Person("tom", 10)print(mike < tom)print(mike <= tom)print(mike > tom)print(mike >= tom)print(mike == tom)

到此,相信大家对“python高阶函数functools模块如何使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯