zoukankan      html  css  js  c++  java
  • Python之偏函数

    1.1偏函数

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

      

    1.2partial的核心代码

    def partial(func,*args,**keywords):
        def newfunc(*fargs,**fkeywords): #包装函数
            newkeywords = keywords.copy()
            newkeywords.update(fkeywords)
            return func(*(args + fargs),**newkeywords)
        newfunc.func = func   #保留原函数
        newfunc.args = args   #保留原函数的位置参数
        newfunc.keywords = keywords #保留原函数的关键字参数
        return newfunc
    
    def add(x,y):
        return x+y
    partial(add,x=4).func  #对保留原函数的使用
    foo = partial(add,x=4)
    foo(y=5)

    1.3partial的使用

    import functools
    from functools import partial
    import inspect
    def add(x,y)->int:
        return x+y
    new_add = partial(add,y=5)
    sig_p = inspect.signature(new_add)
    params_p = sig_p.parameters
    params_p   #mappingproxy({'x': <Parameter "x">, 'y': <Parameter "y=5">})
    
    import functools
    import inspect
    def add_p1(x,y,*args):
        return x+y
    add_p1 = functools.partial(add_p1,1,3,6,5)
    add_p1(9,10,y=20,x=26) #TypeError: add_p1() got multiple values for argument 'y'
    sig_p1=inspect.signature(add_p1)
    params_p1 = sig_p1.parameters
    params_p1 #mappingproxy({'args': <Parameter "*args">})

    总结:partial传入关键字参数,inspect.signature会保留这个参数签名;patical传入位置参数的时候,函数签名不会保留这个位置参数,所以第二个例子签名只有*args

    本文为原创文章,转载请标明出处
  • 相关阅读:
    .Uva&LA部分题目代码
    历史遗留问题列表
    hdu5681 zxa and wifi
    算法心得2:关于k个最小和问题的思考
    算法心得1:由$nlogn$复杂度的LIS算法引起的思考
    Codeforces Round #336 Marbles
    HDU 2571 命运
    POJ 3630 && HDU 1671 Phone list(静态字典树)
    静态字典树和动态字典树模板
    双向广搜
  • 原文地址:https://www.cnblogs.com/harden13/p/8891250.html
Copyright © 2011-2022 走看看