函数对象与闭包

函数对象

函数对象的精髓就是函数可以当做变量去使用

函数可以被引用

注意赋值函数不能加括号

加括号是函数的调用,不加括号是函数体内函数体代码的内存地址

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('输入的指令不存在')

  

原文地址:https://www.cnblogs.com/Tornadoes-Destroy-Parking-Lots/p/12534438.html