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