iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python高阶函数functools模块如何使用
  • 790
分享到

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

2023-07-05 16:07:27 790人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

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

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

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

functools模块

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

  • cmp_to_key,

  • total_ordering,

  • reduce,

  • partial,

  • update_wrapper

  • wraps

reduce

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

  • function:接受两个参数的函数;

  • sequence:可迭代对象(tuple/list/dict/str);

  • initial:可选初始值;

# 累加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对象:

  • func:一个可调用的对象或函数;

  • args:要冻结的位置参数;

  • keywords:要冻结的关键字参数。

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引入)将类方法转换为泛型函数:

  • 泛型函数:是指由多个函数(针对不同类型的实现)组成的函数,调用时由分派算法决定使用哪个实现;

  • Single dispatch:一种泛型函数分派形式,基于第一个参数的类型来决定;

dispatch使用:

  • singledispatch装饰dispatch的基函数base_fun(即,注册object类型);

  • 注册后续分发函数使用装饰器@{base_fun}.reGISter({type}),注册每种需要特殊处理的类型;

  • 分发函数名称无关紧要,_是个不错的选择;

  • 可以叠放多个register装饰器,让同一个函数支持多种类型;

# 缺省匹配类型,注册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):

  • 比较函数:接受两个参数,比较这两个参数,并返回0、1或-1;

  • 关键字函数:接受一个参数,返回其对应的可比较对象;

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模块如何使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: python高阶函数functools模块如何使用

本文链接: https://www.lsjlt.com/news/353458.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python高阶函数functools模块如何使用
    本篇内容主要讲解“python高阶函数functools模块如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python高阶函数functools模块如何使用”吧!functools模块提...
    99+
    2023-07-05
  • Python编程functools模块创建修改的高阶函数解析
    目录partial 函数装饰器 @lru_cachereduce 函数partial 函数 partial 为偏函数(有的地方也叫做部分应用函数),它是对函数的二次封装,将现有函数的...
    99+
    2024-04-02
  • Python的functools模块使用及说明
    目录partialupdate_wrapperwrapsreducecmp_to_keylru_cachesingledispatchpartial 用于创建一个偏函数,将...
    99+
    2024-04-02
  • Python函数和模块如何使用
    这篇“Python函数和模块如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python函数和模块如何使用”文章吧。一...
    99+
    2023-06-30
  • Python中如何使用模块级函数
    本篇文章为大家展示了Python中如何使用模块级函数,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。你不一定要产生一个 `RegexObject` 对象然後再调用它的方法;re 模块也提供了***函数...
    99+
    2023-06-17
  • python如何定义高阶函数
    在python中定义高阶函数的方法map函数map函数可以接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并且把结果作为新的列表返回。定义方法:import random#定义阶乘函数def f(x):re...
    99+
    2024-04-02
  • python高阶函数使用的方法
    今天小编给大家分享一下python高阶函数使用的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、高阶函数函数定义pyt...
    99+
    2023-07-02
  • Python高阶函数map()怎么使用
    这篇文章主要介绍了Python高阶函数map()怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python高阶函数map()怎么使用文章都会有所收获,下面我们一起来看看吧。简介:格式:map(funct...
    99+
    2023-07-05
  • Python常见内置高阶函数即高阶函数用法
    目录1.什么是高阶函数?2.高阶函数-map、filter、reduce2.1map函数2.2filter函数2.3reduce函数1.什么是高阶函数?   高阶函数:一个函数可...
    99+
    2024-04-02
  • python高阶函数使用教程示例
    目录一、高阶函数函数定义函数名可作为返回值、也可作为参数(1)函数名作为参数(2)函数名作为返回值二、常用的高阶函数(1)map(function,iterable)(2)filte...
    99+
    2024-04-02
  • Python函数和模块怎么使用
    本篇内容介绍了“Python函数和模块怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、函数和模块概述(一)函数概述函数可以看成是语...
    99+
    2023-06-22
  • 怎么使用Python函数和模块
    本篇内容介绍了“怎么使用Python函数和模块”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在讲解本章节的内容之前,我们先来研究一道数学题,...
    99+
    2023-06-01
  • Python函数和模块的使用详情
    目录一、定义函数二、函数的参数三、用模块管理函数四、变量的作用域 一、定义函数 在Python中可以使用def关键字来定义函数,命名规则跟变量的命名规则是一致的。在函数名后...
    99+
    2024-04-02
  • Python高阶函数map()简介和使用详解
    目录简介:示例:示例(1):输出map()函数返回值(迭代器)结果示例(2):与循环对比示例(3):字符串转列表示例(4):元组转列表示例(5):提取字典的键key,通过函数作用放入...
    99+
    2023-03-03
    Python 高阶函数map使用 Python map函数
  • Python函及模块的使用
    目录1、函数的作用2、定义函数3、函数的参数3.1 参数的默认值3.2 可变参数4、用模块管理函数4.1 示例代码module.py5、变量的作用域1、函数的作用 编程大师Mart...
    99+
    2024-04-02
  • Python中如何使用随机数模块
    这篇文章给大家介绍Python中如何使用随机数模块,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。随机整数:>>> import random  >>...
    99+
    2023-06-17
  • python如何使用import模块
    这篇文章给大家分享的是有关python如何使用import模块的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。import模块在Python经常使用import声明,以使用其他模块...
    99+
    2024-04-02
  • Python pluggy模块如何使用
    本篇内容介绍了“Python pluggy模块如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 pluggy 简介plug...
    99+
    2023-06-30
  • Python decimal模块如何使用
    这篇文章主要介绍“Python decimal模块如何使用”,在日常操作中,相信很多人在Python decimal模块如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python&...
    99+
    2023-07-05
  • 如何使用python xml模块
    本篇内容主要讲解“如何使用python xml模块”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用python xml模块”吧!一、xml简介xml是实现不同语言或程序之间进行数据交换的协...
    99+
    2023-06-07
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作