首页 > 技术文章 > Python的函数对象

liunaixu 2020-03-31 16:49 原文

一、函数对象
  函数对象:指的是函数可以被当作“数据”来处理
  函数可以做什么?
  (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('输入的指令不存在')

 

推荐阅读