第五章 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