zoukankan      html  css  js  c++  java
  • python函数编程-偏函数partial function

    一般的,通过设定函数参数的默认值,可以减低函数调用的难度。比如:int()函数可以把字符串转换成整数:

    >>> int('123')
    123

    事实上,int()函数还提供额外的base参数,表示进制,只是默认值是10而已:

    >>> int('123',base=16)
    291
    >>> int('123',16)
    291

    现在,如果我们需要转换大量的二进制字符串,每次都调用int(x,base=2)显得比较麻烦。这时我们可以尝试封装函数int(x,base=2)成为int2(x),而int2(x)相当于:

    >>> def int2(x,base=2):
    ...     return int(x,base)
    ...
    >>> int2('1000111')
    71

    在python的functools模块中就内置了partial函数,用于把函数的某些参数固定住(也就是设置默认值),最后返回一个新函数。这就是偏函数(和数学中的偏函数的意义不同)。上述例子可以使用偏函数改写为:

    >>> import functools
    >>> int2 = functools.partial(int,base=2)
    >>> int2('110011')
    51

    其实,上面新的int2函数,仅仅是把base参数的默认值由原来的10变为2。我们还是可以在函数调用的时候传入其他的值:

    >>> int2('110011',base = 10)
    110011

    创建偏函数的时候,可以接收3种类型的参数:函数、*args、**kw:

    当写成:

     int2 = functools.partial(int,base=2)

    int2('110011')

    执行的结果相当于:

    kw = { 'base': 2 }
    int('10010', **kw)

    当写成:

    >>> max2 = functools.partial(max,5)
    >>> max2(3,6)  
    6

    相当于:

    args = (10, 5, 6, 7)
    max(*args)

    可见,如果一个函数的参数个数太多,需要简化的时候,使用functools.partial函数,可以创建一个函数,这个新函数可以将原函数的部分参数初始化(即赋默认值),调用的时候更简单

  • 相关阅读:
    ZOJ 3278 8G Island 二分+二分
    POJ 2785 4 Values whose Sum is 0 二分
    POJ 3063 Sherlock Holmes 随机化
    UVA 10881 Piortr‘s Ants 思维 模拟
    UVA 1388 Graveyard
    Codeforces Round #410 (Div. 2) B. Mike and strings
    Codeforces 821B
    51nod 1103 N的倍数 抽屉原理
    Codeforces Round #427 (Div. 2) 835D
    Codeforces Round #427 (Div. 2) 835C-Star sky 二维前缀和
  • 原文地址:https://www.cnblogs.com/hiwuchong/p/8138386.html
Copyright © 2011-2022 走看看