高阶函数
什么是高阶函数
1,接收的参数,是一个函数名(是一个函数的引用)
2,函数的返回值,是一个函数名
满足任一条,就是高阶函数
情况一
"""
高阶函数之,函数接收的参数是一个函数名
"""
def eat():
print('吃肉')
def func(f):
# f = eat
f() # eat()
func(eat)
情况二
"""
高阶函数之,函数的返回值是一个函数名
"""
def run():
print('在跑')
def eat():
print('吃肉')
return run
r = eat() # r = run
r() # run()
函数名的本质
函数名本质就是一个标识符
函数体才是函数的本体
函数名会指向函数本体
如果把一个函数名赋值给另一个变量
那么通过这个变量加上括号
也可以调用函数
例子
def func():
print('这是func函数')
m = func
m()
n = m
n()
f = n
f()
C:\Users\python_hui\Anaconda3\python.exe G:/untitled2/43/t1高阶函数/main.py
这是func函数
这是func函数
这是func函数
Process finished with exit code 0
函数的嵌套
函数里面定义函数
"""
函数的嵌套
"""
def cat():
def run():
print('在跑')
run()
cat()
闭包
首先给出闭包函数的必要条件:
- 闭包函数必须返回一个函数名
- 闭包函数返回的那个函数必须引用父级函数变量(一般不能是全局变量)
闭包
1,它是一个高阶函数
因为外部的函数返回值是一个函数名(内部函数)
2,它是一个函数的嵌套
外部函数里面又定义了内部函数
3,内部的函数要用到外部函数的局部变量
闭包模型
def outer():
name = "张三"
def inner():
print(name)
return inner # 高阶函数
m = outer()
m()
局部变量的两种形态
局部变量的特点
生命,从函数执行,到函数结束
形态1,函数内部直接通过赋值方式定义的变量
它就是一个局部变量
本例中的age就是一个函数中的局部变量
def func():
age = 18
print(age)
func()
形态2,通过形参方式接收的数据也是局部变量
本例中的age就是一个局部变量
实参的数据赋给形参的过程
就相当于,在函数的内部定义
age = 18
最终的效果和形态一是一样的
def func(age):
print(age)
func(18)
外部函数带参数的闭包
def outer(name):
# name = "吕布"
def inner():
print(name)
return inner
m = outer("吕布")
m()
三层函数闭包
def func():
name = "李白"
def outer(name):
def inner():
print(name)
return inner
return outer
name = "赵云"
f = func()
o = f(name)
o()
def func(age):
def outer(name):
def inner():
print(name)
print(age)
return inner
return outer
f = func(18)
o = f("刘备")
o()