偏函数`partial`之理解

偏函数:和装饰器一样,它可以扩展函数的功能,但不完全等价于装饰器。通常应用的场景是频繁调用某个函数时,其中某些参数是已知的固定值,频繁调用导致代码冗余,此时使用偏函数可以优化。

  • 举一个很简单的例子:计算100 加任意数的和是多少。

    通常实现方式:

    # 第一种做法:
    def add(*args):
        return sum(args)
    
    print(add(1, 2, 3) + 100)
    print(add(5, 5, 5) + 100)
    
    # 第二种做法
    def add(*args):
        # 对传入的数值相加后,再加上100返回
        return sum(args) + 100
    
    print(add(1, 2, 3))  # 106
    print(add(5, 5, 5))  # 115
    
  • 两种做法都存在问题:第一种,100固定值会反复出现,代码冗余;第二种,当需要修改 100 固定值的时候,需要改动 add 方法。
    使用parital 实现:

    from functools import partial
    
    def add(*args):
        return sum(args)
    
    add_100 = partial(add, 100)
    print(add_100(1, 2, 3))  # 106
    
    add_101 = partial(add, 101)
    print(add_101(1, 2, 3))  # 107
    
  • 偏函数的官方定义:

    func = functools.partial(func, *args, **keywords)
    # 参数解释:
    # func: 需要被扩展的函数,返回的函数其实是一个类 func 的函数
    # *args: 需要被固定的位置参数
    # **kwargs: 需要被固定的关键字参数
    # (如果在原来的函数 func 中关键字不存在,将会扩展,如果存在,则会覆盖,如下例)
    
    • 参数演示

      # 普通函数及其调用
      def add(*args, **kwargs):
          # 打印位置参数
          for n in args:
              print(n)
          print("-"*20)
          # 打印关键字参数
          for k, v in kwargs.items():
             print('%s:%s' % (k, v))
      # 示1.
      add(1, 2, 3, v1=10, v2=20)
      
      
      # 偏函数及其调用
      add_partial = partial(add, 10, k1=10, k2=20)
      # 示2.增加k3关键字参数
      add_partial(1, 2, 3, k3=20)
      # 示3.覆盖k1关键字参数
      add_partial(1, 2, 3, k1=20)
      
    • 演示结果

      # 示1结果:
      1
      2
      3
      --------------------
      v1:10
      v2:20
      
      # 示2结果:
      10
      1
      2
      3
      --------------------
      k1:10
      k2:20
      k3:20
      
      # 示3结果:
      10
      1
      2
      3
      --------------------
      k1:20
      k2:20
      
      Process finished with exit code 0:
      
  • 官方对偏函数的解释说明:

    functools.partial(func, *args, **keywords)
    Return a new partial object which when called will behave like func called with the positional arguments args and keyword arguments keywords. If more arguments are supplied to the call, they are appended to args. If additional keyword arguments are supplied, they extend and override keywords. Roughly equivalent to:

    • 译为中文:

      它返回一个偏函数对象,这个对象和 func 一样,可以被调用,同时在调用的时候可以指定位置参数 (*args) 和 关键字参数(**kwargs)。如果有更多的位置参数提供调用,它们会被附加到 args 中。如果有额外的关键字参数提供,它们将会扩展并覆盖原有的关键字参数。它的实现大致等同于如下代码:

      # 定义一个函数,它接受三个参数
      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
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值