文章目录

  • 高阶函数
  • 先了解函数的实质
  • 高阶函数条件
  • 高阶函数实验
  • 实验过程解析
  • 实验结论


高阶函数

高阶函数英文叫Higher-order function。记得大学高等数学里面的什么“高阶导数”不,其实就是方程对求导数再求导数,二阶导数就是导两遍,高阶就可以导多遍。
在python中,高阶函数,与高阶导数并不是一个东西,但可以拿来类比 😃 #^_^#,不记得高阶导数没有关系,哈哈,因为一点关系也没有。😃 #^_^#
高阶函数,对调用函数实参函数执行后再函数执行。不好理解?继续往下看

先了解函数的实质

  • 从函数的定义知道,函数其实只是使用一个友好的函数名称封装了一大段后续需要经常使用的代码,后续在使用时,只需要调用这个名称而已。
  • 那为什么函数不调用不执行,且形参什么的都不占用内存?
  • 函数体,只是一段代码放置在文件中,而文件位于硬盘上,对面向过程的编程语言而言,代码在执行时,会按照代码执行的顺序依次将代码加载至内存,而此时对于函数体的代码 位于内存中,而函数名称则是指向这段代码的变量,如下所示:
def function():
    print("Hello,World")

print(id(function()))

"""
Hello,World
2031525096
"""

如上所示,使用函数名调用了函数体,并使用id() 函数显示出所指向的内存地址。由此可见与之前所述的变量指向数值的内存地址如出一辙。那既然是这样,是否可以像变量指向数值一样,再将此变量赋值给其它变量呢?出于此疑问,我们再做如下实验:

def function():
    print("Hello,World")

functiontest = function()
print(id(functiontest))
print("*".center(100,"*")) # 此行主要用于输出显示时能显示出分割符,无具体意义
print(id(function()))

"""
Hello,World
2031525096
****************************************************************************************************
Hello,World
2031525096
"""

函数调用与变量都指向了同一个内存地址,所以具备同样的功用,都标准输出到显示器了。
如此,函数的本质其实是一个名称指向一段代码的内存地址。

既然函数体的名称与变量都是指向存值的内存地址,那我们是否可以直接将函数体的名称作为形参使用?我们能否定义一个函数,此函数定义多个形参,其中的部分形参为函数体的名称,让其它形参为此函数体的参数?
如此,我们进一步实验:

高阶函数条件

  1. 函数名可以作为参数输入
  2. 函数名可以做为返回值
  3. 满足其中一个即是高阶函数

高阶函数实验

def PrintStar(number):
    for i in range(number):
        print("*",end="")
    print()

def PrintWellNumber(number):
    for i in range(number):
        print("#",end="")
    print()

def Printat(number):
    for i in range(number):
        print("@",end="")
    print()

def splitLine(number,func):
    func(number)

splitLine(50,PrintStar)
splitLine(100,PrintWellNumber)
splitLine(150,Printat)

"""
**************************************************
####################################################################################################
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
"""

实验过程解析

  1. 定义了三个函数print开头的用于打印分割符,但是具体打印“分割符”号的数量由调用函数时的实参决定
  2. 定义一个高阶函数,高阶函数的两个形参,一个是打印分割符的数量,一个是3个print函数中一个,用于决定打印哪个符号做为分割符
  3. 调用splitline函数,用于打印分割线

实验结论

  1. 调用函数后跟括号,则是直接调用了函数体,如果不加括号,则可引用此函数名所指向的内存地址
  2. 函数名称可做为其它函数的形参。
  3. 函数名可赋值给其它变量,用于指向同一个函数的内存地址。