zoukankan      html  css  js  c++  java
  • 函数对象与闭包

    函数对象

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

    函数可以被引用

    注意赋值函数不能加括号

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

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

      

  • 相关阅读:
    收藏转载:一些视频流地址
    转载收藏:Android 输入法表情上传服务器
    Android N 的开机启动流程概述
    列举至少3种Support包中提供的布局或工具
    代码混淆定义
    应用内存优化主要思路
    锁屏的一些动画
    毛玻璃效果
    关于宏定义
    openresty性能测试报告分析
  • 原文地址:https://www.cnblogs.com/Tornadoes-Destroy-Parking-Lots/p/12534438.html
Copyright © 2011-2022 走看看