函数对象与闭包
函数对象
函数对象的精髓就是函数可以当做变量去使用
函数可以被引用
注意赋值函数不能加括号
加括号是函数的调用,不加括号是函数体内函数体代码的内存地址
def func():
print("func 函数")
f1 = func
f1()
>>>func 函数
函数可以作为容器类型的元素
用这种方法也可以去优化我们多个函数的选择调用
def func():
print("func 函数")
dict1= {"func":func}
dict1["func"]()
>>>func 函数 #一个的
函数可以作为参数传给另外元素
def foo(x,y,func):
return func(x,y)
foo(1,2,add)
3
函数的返回值可以是一个函数
def bar():
return add
func=bar()
func(1,2)
3
-
闭包函数=函数空间与作用域+函数嵌套+函数对象
-
核心点:名字的查找关系是以函数定义阶段为准
什么是闭包函数
- “闭”函数:指的是该函数的内嵌函数
def foo():
def bar():
pass
#在这个场景下bar就是闭函数
- “包”函数:指的是函数包含对外层函数作用域名字的引用(不是对全局作用域)
- 闭包函数:名称空间和作用域的应用+函数嵌套
def foo():
x=55555
def bar():
print(x)
#在这个例子里bar包含对外层函数foo内作用域里名字x的引用
#所以此时bar是闭包函数
闭包函数的用法
此时通过引入闭包函数的概念,知道了两种函数体传参的方式
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
以函数为例,来优化之前的ATM系统
while True:
print("""
0 退出
1 登录
2 转账
3 查询余额
4 提现
5 注册
""")
choice = input('请输入命令编号:').strip()
if not choice.isdigit():
print('必须输入编号')
continue
if choice == '0':
break
if choice in func_dic:
func_dic[choice]()
else:
print('输入的指令不存在')
if choice == '1':
login()
elif choice == '2':
transfer()
elif choice == '3':
check_banlance()
elif choice == '4':
withdraw()
else:
print('输入的指令不存在')
用函数对象改写
func_dic = {
'0': ['退出', None],
'1': ['登录', login],
'2': ['转账', transfer],
'3': ['查询余额', check_banlance],
'4': ['提现', withdraw],
'5': ['注册', register]
}
# func_dic['1']()
while True:
for k in func_dic:
print(k, func_dic[k][0])
choice = input('请输入命令编号:').strip()
if not choice.isdigit():
print('必须输入编号')
continue
if choice == '0':
break
# choice='1'
if choice in func_dic:
func_dic[choice][1]()
else:
print('输入的指令不存在')

浙公网安备 33010602011771号