函数对象
精髓:可以把函数当成变量去用(即函数名当成变量去用)
定义一个函数,本质是func=内存地址
def func():
print("函数对象")
1、可以赋值
f=func() #如果是func(),运行了函数,把函数的返回值赋值给f
print(f)
# None
#通过函数名找到函数的内存地址(即函数名找到函数体代码)
f1=func #把函数名func赋值给f1变量,func和f1都指向同一个内存地址
#print(f1,func)
f1() #调用的是func()函数
2、可以当做函数的参数传递给另外一个函数
def func1(x): #x=func的内存地址
print(x)
func1(func) #func1(fcun的内存地址)
#<function func at 0x000000000217B040>
3、可以当做函数的返回值
def func2(x): #x=func的内存地址
return x #返回fcun的内存地址
res=func2(func) #func2(fcun的内存地址),返回fcun的内存地址赋值给变量res
print(res)
#<function func at 0x000000000218B040>
res()
#函数对象
4、可以当做容器类型的一个元素
l=[func]
l[0]() #通过列表调用函数
#函数对象
d={'k':func}
d['k']() #通过字典key调用函数
#函数对象
案例:
'''
def login():
print("登录功能")
def query():
print("查询功能")
def transfer():
print("转账功能")
#打印多行
while True:
print("""
0 退出
1 登录
2 查询
3 转账
""")
User_Input=input("请输入编号:").strip()
if not User_Input.isdigit(): #如果输入的是数字就是True,not True 取反是False,如果输入的不是数字就是Flase,not False 取反是True
print("输入的不是数字!!!")
continue
if User_Input == "0":
break
if User_Input == "1":
login()
elif User_Input == "2":
query()
elif User_Input == "3":
transfer()
else:
print("输入的不准确!")
'''
针对上面的案例进行优化,如果扩展多个功能就需要在if判断中添加好多
def login():
print("登录功能")
def query():
print("查询功能")
def transfer():
print("转账功能")
#扩展多个功能
def register():
print("注册")
def add():
print("添加")
func_dict={
'1':login,
'2':query,
'3':transfer,
'4':register,
'5':add
}
while True:
print("""
0 退出
1 登录
2 查询
3 转账
4 注册
5 添加
""")
User_Input=input("请输入编号:").strip()
if not User_Input.isdigit(): #如果输入的是数字就是True,not True 取反是False,如果输入的不是数字就是Flase,not False 取反是True
print("输入的不是数字!!!")
continue
if User_Input == "0":
break
if User_Input in func_dict: #判断字典的key是否存在(字典的key就是输入的编号)
func_dict[User_Input]() #输入的编号存在就调用函数的功能
else:
print("输入的不准确!")
'''
针对上面的案例在进行优化,如果添加功能还得手动添加提示以及输入编号0退出
def login():
print("登录功能")
def query():
print("查询功能")
def transfer():
print("转账功能")
def register():
print("注册")
def add():
print("添加")
def delete():
print("删除")
#{}内用逗号分隔开多个key:value,其中value可以是任意类型,但是key必须是不可变类型(通常key是字符串),且key不能重复
func_dict={
'''
'0':['退出',None], #对于没有功能的,为了保持可读性,使用None
'1':['登录',login],
'2':['查询',query],
'3':['转账',transfer],
'4':['注册',register],
'5':['添加',add],
'6':['删除',delete]
'''
#对功能名称没有修改所有使用元祖
'0':('退出',None), #对于没有功能的,为了保持可读性,使用None
'1':('登录',login),
'2':('查询',query),
'3':('转账',transfer),
'4':('注册',register),
'5':('添加',add),
'6':('删除',delete)
}
while True:
for k in func_dict:
print(k,func_dict[k][0]) #循环字典,key是提示编号,通过字典获取key的值,值是列表,通过索引获取列表的第一个元素
User_Input=input("请输入编号:").strip()
#判断输入的是非数字才会执行
if not User_Input.isdigit(): #如果输入的是数字就是True,not True 取反是False,如果输入的不是数字就是Flase,not False 取反是True
print("输入的不是数字!!!")
continue
#判断输入的是编号0才会执行
if User_Input == "0":
break
#判断输入的除非数字和非0才会被执行
if User_Input in func_dict: #判断字典的key是否存在(字典的key就是输入的编号)
func_dict[User_Input][1]() #输入的编号存在就调用函数的功能(函数功能写在字典中,通过字典key获取字典的值,值是列表,列表中第二个索引是函数功能名)
else:
print("输入的不准确!")