• Python的函数对象


    一、函数对象
      函数对象:指的是函数可以被当作“数据”来处理
      函数可以做什么?
      (1)函数可以被引用。
      (2)函数可以作为容器类型的元素。
      (3)函数可以作为参数传入另外一个函数。
      (4)函数的返回值可以是一个函数。

    精髓:可以把函数当成变量去用
    func = 内存地址
    def func():
        print('func func')
    
    # 注意func和func()的区别?
    #   func是变量名,相当于内存地址的别名。
    #   func()是调用函数,得到的是一个结果。
    
    # 1、可以赋值:函数可以被引用
    func
    # f = func  # 就是将func的内存地址赋给一个变量
    # print(f,func)  # <function func at 0x000001C31B2895E0> <function func at 0x000001C31B2895E0>
    # f1 = func()  # 就是将func()的结果赋给一个变量
    # print(f1)  # None
    # print(f())  # func func    None
    # print(func())  # # func func    None
    # 2、可以当作函数的参数传入
    def foo(x):   # x = func的内存地址
        # print(x)  # <function func at 0x000001D9F8E795E0>
        # 下面的效果相同
        x()
        func()
    
    # a = 111
    # foo(111)
    # foo(a)
    # func的内存地址当作参数传入
    foo(func)  # foo(func的内存地址)
    # 3、可以把作函数当作另一个函数的返回值
    # def foo(x):  # x = func的内存地址
    #     return x  # return func的内存地址
    # res = foo(func)  # foo(func的内存地址)
    # print(res)  # <function func at 0x000001BA694195E0>
    #
    # res()  # 加入()后得到结果:func func
    
    # 4、可以当作容器类型的一个元素。
    # 实例1:列表
    # l = [func,]
    # print(l)  # [<function func at 0x000002F8227195E0>]
    # 取得列表中元素如下
    # l[0]
    # 调用列表
    # l[0]()  # func func
    
    # 实例2:字典
    # dic={'k1':func}
    # print(dic)  # {'k1': <function func at 0x00000266D75895E0>}
    # 调用
    # dic['k1']()  # func func

     

    # 函数对象应用,实例:ATM机功能
    # def login():
    #     print('登录功能')
    #
    # def transfer():
    #     print('转账功能')
    #
    # def check_banlance():
    #     print('查询余额')
    #
    # # 增加一个取款的功能
    # def withdraw():
    #     print('体现')
    #
    # while True:
    #     print("""
    #     0 推出
    #     1 登录
    #     2 转账
    #     3 查询余额
    #     4 体现
    #     """)
    #     choice= input('请输入命令编号:').strip()
    #     if not choice.isdigit():  # 判断是否为数字,不是数字则进入下一次0
    #         print('必须输入编号:')
    #         continue
    #     if choice == '0':
    #         break
    #     elif choice == '1':
    #         login()
    #     elif choice == '2':
    #         transfer()
    #     elif choice == '3':
    #          check_banlance()
    #     elif choice == '4':
    #         withdraw()
    #     else:
    #         print('输入的指令不存在')
    # 思考;如果以后要求加入10个功能,
    
    # def login():
    #     print('登录功能')
    # def transfer():
    #     print('转账功能')
    # def check_banlance():
    #     print('查询余额')
    # # 增加一个取款的功能
    # def withdraw():
    #     print('体现')
    #
    # # 增加一个注册功能
    # def register():
    #     print("注册")
    # # 使用字典形式优化上面if...elif...的无线增多
    # func_dic={  # 这里不加'()'的含义要明白,不加()说明我们要的是内存地址。
    #     '1':login,
    #     '2':transfer,
    #     '3':check_banlance,
    #     '4':withdraw,
    #     '5':register
    # }
    # # 要想访问到相应的功能怎么办?使用如下办法:
    # # func_dic['1']()
    # # 如何判断命令是否存在
    #
    # while True:
    #     print("""
    #     0 推出
    #     1 登录
    #     2 转账
    #     3 查询余额
    #     4 体现
    #     5 注册
    #     """)
    #     choice= input('请输入命令编号:').strip()
    #     if not choice.isdigit():  # 判断是否为数字,不是数字则进入下一次0
    #         print('必须输入编号:')
    #         continue
    #     if choice == '0':
    #         break
    #     # 我们判断输入的是否为字典中的编号,取代if...elif...的更多
    #     if choice in func_dic:
    #         func_dic[choice]()
    #     else:
    #         print('输入的指令不存在')
    # 再次优化上面的代码
    def login():
        print('登录功能')
    def transfer():
        print('转账功能')
    def check_banlance():
        print('查询余额')
    # 增加一个取款的功能
    def withdraw():
        print('体现')
    
    # 增加一个注册功能
    def register():
        print("注册")
    # 使用字典形式优化上面if...elif...的无线增多
    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():  # 判断是否为数字,不是数字则进入下一次0
            print('必须输入编号:')
            continue
        if choice == '0':
            break
        # 我们判断输入的是否为字典中的编号,取代if...elif...的更多
        if choice in func_dic:
            func_dic[choice][1]()  # 获取字典中对应的值
        else:
            print('输入的指令不存在')
  • 相关阅读:
    服务器时间不准导致 com.sun.facelets.impl.DefaultFacelet refresh
    推荐10款来自极客标签的超棒前端特效[第五期] java程序员
    IE10的市场占有率扩充了一倍 java程序员
    固定背景实现的背景滚动特效 java程序员
    支持触摸设备的响应式HTML5音频播放器 AudioPlayer.js java程序员
    WebRTC与Ace在线代码编辑器合作,实现实时协作编程 java程序员
    最流行的JavaScript库,jQuery不再支持IE旧版本 java程序员
    Jquery实现鼠标移上弹出提示框,移出消失 java程序员
    xxx.c: Error: C3065E: type of input file 'xxxx' unknown java程序员
    35+多用途WordPress主题 java程序员
  • 原文地址:https://www.cnblogs.com/liunaixu/p/12606283.html
Copyright © 2020-2023  润新知