目录
一、函数对象
函数对象的精髓就是函数可以当做变量去使用
1.1函数可以被引用
注意赋值函数不能加括号
加括号是函数的调用,不加括号是函数体内函数体代码的内存地址
def func():
print("func 函数")
f1 = func
f1()
>>>func 函数
1.2函数可以作为容器类型的元素
用这种方法也可以去优化我们多个函数的选择调用
一个函数:
def func():
print("func 函数")
dict1= {"func":func}
dict1["func"]()
>>>func 函数
多个函数:
#功能函数
def func1():
print("登录")
def func2():
print("注册")
def func3():
print("检查")
#存放功能函数的字典
func_dict = {
"0":["退出",exit],
"1":["注册",func1],
"2":["登录",func2],
"3":["检查",func3]}
while True:
for key in func_dict:
print(key,func_dict[key][0])
cmd = input("请输入指令>")
if not cmd.isdigit():
print("请输入数字")
continue
elif cmd in func_dict:
func_dict[cmd][1]()
else:
print("不存在该指令")
1.3函数可以作为参数传入另外一个函数
def func(x):
x()
def foo():
print("函数 foo")
func(foo)
>>>函数 foo
1.4函数的返回值可以是一个函数
def foo():
print("函数 foo")
def func():
return foo
res = func()
res()
>>>函数 foo
二、闭包函数
前提:
闭包函数=函数空间与作用域+函数嵌套+函数对象
核心点:名字的查找关系是以函数定义阶段为准
1 什么是闭包函数
“闭”函数:指的是该函数的内嵌函数
def foo():
def bar():
pass
#在这个场景下bar就是闭函数
“包”函数:指的是函数包含对外层函数作用域名字的引用(不是对全局作用域)
闭包函数:名称空间和作用域的应用+函数嵌套
def foo():
x=123123
def bar():
print(x)
#在这个例子里bar包含对外层函数foo内作用域里名字x的引用
#所以此时bar是闭包函数
2 闭包函数的用法
def foo():
x=123
def bar():
print(x)
return bar #foo函数的返回值是bar函数的内存地址
f = foo()#将foo函数的返回值赋值给f
f()#此时调用f函数等于在调用闭包函数bar
>>>123
此时通过引入闭包函数的概念,我们知道了两种函数体传参的方式
方式一:直接把函数体需要的参数定义成形参
def foo(x):
print(x)
foo(1)
方式二:通过闭包函数的外层函数作用域里的变量传值
def foo():
x=123
def bar():
print(x)
return bar
bar = foo()
bar()
>>>123
#上面的方式传值x固定是123,当然也可以通过传参的方式自定义传值
def f1(x):
def f2():
return x*2
return f2
f2 = f1(2)
print(f2())
>>>4