Python之functools库

functools库用于高阶函数,指那些作用于函数或者返回其他函数的函数functools提供方法如下:cmp_to_key将老式的比较函数转换为关键字函数,与接收keyfunction的函数

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

  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输出:
Python之functools库

使用@total_ordering输出:

Python之functools库

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前输出:
Python之functools库

使用@wraps后输出

Python之functools库

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120186.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • neokylin操作系统_kinit命令

    neokylin操作系统_kinit命令基础命令进入根目录cd/新建用户useraddname切换用户suname设置用户密码passwdname创建目录mkdirdirname目录删除(强制)rm(-rf)dirname文件创建touchfilename查看当前目录下的文件ll(-a查看隐藏文件)pwd查看当前目录或文件位置创建文件Touchaa.dataVimaaa.dataechomljs>data.log文件查看catfilename仅查看vimf

    2022年8月10日
    3
  • SQL行转列、列转行

    SQL行转列、列转行这个主题还是比较常见的,行转列主要适用于对数据作聚合统计,如统计某类目的商品在某个时间区间的销售情况。列转行问题同样也很常见。一、整理测试数据createtablewyc_test( idint(32)notnullauto_increment, namevarchar(80)defaultnull, datedatedefaultn…

    2022年4月4日
    55
  • 傅里叶变换相关公式

    傅里叶变换相关公式傅里叶变换公式

    2022年7月1日
    21
  • Android下基于Iptables的一种app网络访问控制方案(二)

    Android下基于Iptables的一种app网络访问控制方案(二)3.如何在Android系统中集成?以上通过adb shell命令行在Android设备上将方案调通之后,接下来考虑如何集成在Android系统中。作为一个整体解决方案,需要至少解决两部分功能:(1)网络访问规则。包括规则定义、存储、对外接口、对内转化成Iptables命令。(2)Iptables命令执行。第一部分比较简单,在此不详述。主要看第二部分。对于某一个垂直功能,And

    2022年7月23日
    4
  • 低代码开发平台技术架构_一个项目的整体架构是什么

    低代码开发平台技术架构_一个项目的整体架构是什么介绍JAVA低代码快速开发平台的整体架构设计

    2022年8月23日
    5
  • cglib BeanCopier 使用

    cglib BeanCopier 使用cglib是一款比较底层的操作java字节码的框架。 下面通过拷贝bean对象来测试BeanCopier的特性: Java代码  public class OrderEntity {      private int id;      private String name;      // Getters and setters are o

    2022年9月5日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号