# 定义一个求合函数def func(a, b): total = a + breturn total# 高阶函数def high_func (x,y,func):return (func(x,y))print(high_func(5,9,func))def absolute (a):if a > 0:return aelse:return -aprint(absolute(2)) #输出 2print(absolute(-2)) #输出 2other_name_for_absolute = absolute #将变量other_name_for_absolute指向函数absoluteprint(other_name_for_absolute(2)) #输出 2print(other_name_for_absolute(2)) #输出 2other_name_for_absolute=absolute;将函数本身负值给了变量,也就是说:变量可以指向函数。other_name_for_absolute()和absolute()两个函数相同。函数名其实就是指向函数的变量,对于absolute()函数,可将函数名absolute看成变量,它指向一个取正值的函数。
既然函数的参数能接受变量,那么一个函数就能接受另一个函数作为参数,这种函数就能称作高阶函数。
再理解返回一个函数作为结果:
1.仅返回函数,无变量引用,不是闭包。
# 普通高阶函数(非闭包)def outer():# 定义内部函数 def inner():print("我是内部函数")# 返回内部函数return inner# 调用外部函数,得到内部函数f = outer()f() # 输出:我是内部函数inner只是被返回,没有引用outer作用域中的任何变量,不是闭包。
2.返回函数+引用外部变量,是闭包。
当高阶函数返回一个内部函数时,这个被返回的函数并不会立即执行,而是会「携带」外层函数的变量环境(即使外层函数已经执行完毕),这种特性叫做闭包(Closure)。
def outer_func(x):# 定义内部函数(将要被返回的函数) def inner_func(y):# 内部函数使用了外层函数的变量 xreturn x + y# 高阶函数返回内部函数(注意:没有加括号,不是执行)return inner_funcadd_5 = outer_func(5)print(type(add_5)) # 输出 <class 'function'>print(add_5.__name__) # 输出 inner_func# 2. 执行返回的函数result = add_5(3)print(type(result)) # 输出 <class 'int'>print(result) # 输出:8