Python functools 模块

庆云2年前技术文章583

1、reduce 方法

reduce 方法,顾名思义就是减少,map reduce 应用:大数据


语法: reduce(function, sequence[, initial]) -> value


可迭代对象不能为空;初始值没提供就在可迭代对象中取一个元素。


实例:

from functools import reduce
print(reduce(lambda x,y : print(x,y), range(5)))    # 0, 1, 2, 3, 4
'''
0 1     # 第一次取 0、1
None 2  # 第一次的返回值:None、2
None 3  # 第二次的返回值:None、2
None 4  # ......
None
'''

print(reduce(lambda x,y : x+y, range(5)))        # 0, 1, 2, 3, 4
'''
# 求:0 + 1 + 2 + 3 + 4
0 1     # 取0,1            返回 1
1 2     # 取上面的返回值1,2  返回 3
3 3     # 取上面的返回值3,3  返回 6
6 4     # 取上面的返回值6,4  返回 10
'''
print(reduce(lambda x,y : x+y, range(5), 10))    # 10为初始值,结果为:10+0+1+2+3+4
print(sum(range(5), 10))

nums = [6, 9, 4, 2, 4, 10, 5, 9, 6, 9]
print(sum(nums))    # 64
print(reduce(lambda val,x : val + x, nums))      # 64

print(reduce(lambda x,y : x*y, range(1, 6)))     # 5的阶乘:120
import math
print(math.factorial(5))    # 5的阶乘

print(reduce(lambda x,y : x*y, range(1, 6), 10)) # 10为初始值,结果为:10*120


2、partial 方法

偏函数,把函数部分的参数固定下来,相当于为部分的参数添加了一个固定的默认值,形成一个新的函数并返回,从 partial 生成的新函数,是对原函数的封装。

2.1 partial 伪代码

def partial(func, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = keywords.copy()
        newkeywords.update(fkeywords)
        return func(*args, *fargs, **newkeywords)
    newfunc.func = func    # 动态添加一个属性,记住func
    newfunc.args = args    # 记住args
    newfunc.keywords = keywords    # {}
    return newfunc

2.2 partial 实例

from functools import partial
import inspect
def add(x, y, z):
  return x + y + z

newfunc = partial(add, 4)
print(newfunc(5, 6))               # 相当于把x固定下来,返回新函数,在传入y、z参数
print(inspect.signature(newfunc))  # 新函数的签名:(y, z)
print(newfunc(y=3, z=4))           # 相当于:add(4, y=3, z=4)

# 建议定义完偏函数,先查看一下签名
newfunc1 = partial(add, y=4)
print(inspect.signature(newfunc1)) # 新函数的签名:(x, *, y=4, z)
print(newfunc1(4, z=4))
print(newfunc1(4, y=5, z=6))


from functools import partial
def add(x, y, *args) -> int:
    print(args)
    return x + y
newadd = partial(add, 1, 3, 4, 5)

newadd(6)
newadd(6, 7)
newadd(x=6, y=7)

2.3 wraps 偏函数源码剖析

def update_wrapper(wrapper,
                   wrapped,
                   assigned = WRAPPER_ASSIGNMENTS,
                   updated = WRAPPER_UPDATES):

    for attr in assigned:
        try:
            value = getattr(wrapped, attr)
        except AttributeError:
            pass
        else:
            setattr(wrapper, attr, value)
    for attr in updated:
        getattr(wrapper, attr).update(getattr(wrapped, attr, {}))

    wrapper.__wrapped__ = wrapped

    return wrapper

def wraps(wrapped,
          assigned = WRAPPER_ASSIGNMENTS,
          updated = WRAPPER_UPDATES):
    return partial(update_wrapper, wrapped=wrapped,
                   assigned=assigned, updated=updated)
'''
update_wrapper(wrapper, wrapped)

柯里化:
    update_wrapper(wrapper)(fn)
偏函数:
    wraps(fn) ——> def newfunc(wrapper)
    @wraps(fn)
'''


相关文章

HDFS Fsimage分析磁盘目录(文件级别)

HDFS Fsimage分析磁盘目录(文件级别)

首先获取fsimage信息hdfs dfsadmin -fetchImage  /opt/fsimage格式化fsimage 转换为可读文本hdfs oiv -i /opt/fsimage/fsima...

开源大数据集群部署(十九)Hbase部署

开源大数据集群部署(十九)Hbase部署

2.8 HBASE 安装部署hbase组件部署主机HMasterhd1.dtstack.comhd2.dtstack.comHRegionServerhd3.dtstack.com,hd2.dtsta...

MS SQL Server 实战 统计与汇总重复记录

MS SQL Server 实战 统计与汇总重复记录

需求在日常的数据管理应用中,统计和汇总重复记录的情况是经常遇到的一个问题,然后我们会根据统计结果进一步对数据进行合理化处理。比如我们有一组题库数据,主要包括题目和选项字段(如单选题目、多选题目和判断题...

Redis 运维规范_运维管理规范

三、运维管理规范1、密码认证 云上 Redis 的权限控制:账号管理+白名单设置+阿里云子账号权限。对于线下 Redis 可以通过设置密码和 bind 参数文件控制访问。2、合理设置备份策略 Redi...

gitlab的备份和还原

由于gitlab中存放的都是开发人员的工作成果,所以为了保证数据安全,我们会定期对数据进行备份,对gitlab进行备份将会创建一个包含所有库和附件的归档文件。对备份的恢复只能恢复到与备份时的gitla...

rds pg10 ssd云盘升级磁盘类型方案

rds pg10 ssd云盘升级磁盘类型方案

1、升级方案一原实例变更配置方案优缺点:优点:操作方便,升级后能保证数据和存储过程都是正常的。缺点:停机时间较长,整个变更配置期间业务不可用。变更步骤参考:在配置信息区域单击变更配置。(仅包年包月实例...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。