• Python函数式编程(一):高级函数


    首先有一个高级函数的知识。

    一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数。

    def add(x, y, f):
        return f(x) + f(y)
    
    当我们调用add(-5, 6, abs)时,参数x,y和f分别接收-5,6和abs,根据函数定义,我们可以推导计算过程为:
    
    等价于:
    x = -5
    y = 6
    f = abs
    f(x) + f(y) ==> abs(-5) + abs(6) ==> 11
    return 11
    
    print(add(-5, 6, abs))
    >>11

    这里涉及到的概念:

    变量可以指向函数
    
    以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码:
    
    >>> abs(-10)
    10
    但是,如果只写abs呢?
    
    >>> abs
    <built-in function abs>
    可见,abs(-10)是函数调用,而abs是函数本身。
    
    要获得函数调用结果,我们可以把结果赋值给变量:
    
    >>> x = abs(-10)
    >>> x
    10
    但是,如果把函数本身赋值给变量呢?
    
    >>> f = abs
    >>> f
    <built-in function abs>
    结论:函数本身也可以赋值给变量,即:变量可以指向函数。

    如果一个变量指向了一个函数,那么,可否通过该变量来调用这个函数?用代码验证一下:

    
    
    >>> f = abs
    >>> f(-10)
    10
    
    
    

    成功!说明变量f现在已经指向了abs函数本身。直接调用abs()函数和调用变量f()完全相同。

     
    函数名也是变量
    
    那么函数名是什么呢?函数名其实就是指向函数的变量!对于abs()这个函数,完全可以把函数名abs看成变量,它指向一个可以计算绝对值的函数!
    
    如果把abs指向其他对象,会有什么情况发生?
    
    >>> abs = 10
    >>> abs(-10)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'int' object is not callable
    把abs指向10后,就无法通过abs(-10)调用该函数了!因为abs这个变量已经不指向求绝对值函数而是指向一个整数10!
    
    当然实际代码绝对不能这么写,这里是为了说明函数名也是变量。要恢复abs函数,请重启Python交互环境。
    
    注:由于abs函数实际上是定义在import builtins模块中的,所以要让修改abs变量的指向在其它模块也生效,要用import builtins; builtins.abs = 10
  • 相关阅读:
    HDU5418.Victor and World(状压DP)
    POJ2686 Traveling by Stagecoach(状压DP)
    POJ3254Corn Fields(状压DP)
    HDU5407.CRB and Candies(数论)
    CodeForces 352D. Jeff and Furik
    CodeForces 352C. Jeff and Rounding(贪心)
    LightOj 1282 Leading and Trailing
    Ural 1057. Amount of Degrees(数位DP)
    HDU 2089 不要62 (数位DP)
    HDU5366 The mook jong (DP)
  • 原文地址:https://www.cnblogs.com/xqxacm/p/9803789.html
Copyright © 2020-2023  润新知