第五章 python的函数(6):高阶函数


这篇中,我们学习一下python中的高阶函数。

那么,什么是高阶函数?

  • 一下任何一种函数都可以被称作高阶函数:
  • 接受一个或多个函数作为输入
  • return返回另外一个函数

基本定义例:

def func1(a1):  # 求平方
    return a1*a1

def squ_sum(a1,a2,f):  # f函数作为参数
    return f(a1) + f(a2)  # 求函数结果的和

res = squ_sum(2,3,func1)  # 调用。注意使用的函数名,没有()
print(res)

5.5.1 函数的赋值

我们也可以把函数看做一种数据类型(不可变数据类型),所以我们可以试着把函数赋值给变量。

  • 函数的赋值
def func():
    print('v1 is a func!')
    
v1 = func  # 把func函数赋值给v1,这个时候没有()

v1()
  • 函数可以作为列表的元素
def func():
    print('v1 is a func!')
    return 123
    
func_list = [func,func,func]  # 函数作为列表的元素,也没有()

print(func_list[0])  # 这个可以打印func的内存地址
func_list[0]()  # 调用函数

for item in func_list:  # 可以循环调用
    v = item()
    print(v)

执行结果:

<function func at 0x00000000005EC1E0>
v1 is a func!
v1 is a func!
123
v1 is a func!
123
v1 is a func!
123

函数也可以放入集合中,但是一般不放。多放于列表中。
函数可以当做字典的 value 。也可以当做字典的key -> 但是一般不这么用。

放入字典:

def func1():
    print(123)
def func2():
    print(456)

info = {'k1':func1, 'k2':func2}

info['k1']()  # 调用func1函数,注意这里有()
info['k2']()  # 调用func2函数,注意这里有()

5.5.2 混淆题

考虑下面代码块的执行结果:

def func():
    print(123)
    return 666

func_list1 = [func, func, func]  # 放入的是函数名(函数的内存地址)
func_list2 = [func(), func(), func()]  # 放入的是函数的返回值。但是这里会执行函数,所以会打印123

print(func_list1)
print(func_list2)

# func是函数内存地址,func()是函数的return结果

执行结果:

123
123
123
[<function func at 0x000000000204C1E0>, <function func at 0x000000000204C1E0>, <function func at 0x000000000204C1E0>]
[666, 666, 666]

5.5.3 函数当做参数传递

函数可以做函数的参数

考虑下面代码的输出结果:

def func(arg):
    print(arg)

func(1)
func([1,2,3,4])

def show():
    return 999

func(show)  # 打印show函数的内存地址
func(show())  # 打印show的return值
def func(arg):
    arg()  # 执行函数(前提是传入的参数得是函数),这样传入的参数是函数名也可以执行函数了。

def show():
    print(666)

func(show)  # 打印666
result = func(show)  # 这里虽然是赋值,但是会执行一次func(show),所以会打印666
print(result)  # 这里打印的返回结果,是None