函数对象与闭包
函数对象
函数对象的精髓就是函数可以当做变量去使用
函数可以被引用
注意赋值函数不能加括号
加括号是函数的调用,不加括号是函数体内函数体代码的内存地址
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('输入的指令不存在')