函数对象(函数名)
函数对象指函数可以被当做“数据”来处理。
-
函数名可以当成变量赋值
def index(): print('from index') a = index a() print(a) # 函数名就是内存地址
-
函数名可以当成函数的参数
def index(): print('from index') def func(a): # a = index a() print('from func') func(index) # 执行结果: # from index # from func
-
函数名也可以当成函数的返回值
def index(): print('from index') def func(): print('from func') return index res = func() res()
-
函数名可以作为容器类型的元素
def index(): print('from index') l = [1, 2, 3, index] print(l)
练习:
# 注册功能
def register():
print('注册')
# 登录功能
def login():
print('登录')
# 转账功能
def transfer():
print('转账')
# 购物功能
def shopping():
print('购物')
# 提现功能
def withdraw():
print('提现')
func_dict = {
'1': register,
'2': login,
'3': transfer,
'4': shopping,
'5': withdraw
}
while True:
print("""
1. 注册
2. 登录
3. 转账
4. 购物
5. 提现
""")
choice = input('请输入序号:>>>').strip()
if choice in func_dict:
func_name = func_dict[choice] # 得到的就是函数的内存地址,函数名
func_name()
else:
print('请好好输入')
函数的嵌套定义
即在函数里面定义其他函数。
示例:
def all_func(type):
def register():
print('注册')
def login():
print('登录')
def transfer():
print('转账')
def withdraw():
print('提现')
if type == 1:
register()
elif type == 2:
login()
elif type == 3:
transfer()
elif type == 4:
withdraw()
else:
print('请重新输入!')
# all_func(1)
all_func(2)
函数的嵌套调用
即表示在函数里面调用其他函数。
示例:
# 1.比较两个数的大小
def my_max(a, b):
if a > b:
return a
return b
# my_max(1, 2)
# 2. 比较4个数的大小
def many_max(a, b, c, d):
# 先两两比较,a,b
res = my_max(a, b)
res1 = my_max(res, c)
res2 = my_max(res1, d)
return res2
print(many_max(1,2,3,4))
闭包函数
闭:指的是定义在函数内部的函数
包:指的是内嵌函数包含对外部函数作用域(而非全局作用域)中的变量的引用。
两者同时满足才能称之为“闭包函数”。可以说闭包函数为传参的第二种方式。
-
传参的第一种方式:通过形参传参
def index(a,b): print(a,b) index(1,2)
-
传参的第二种方式:闭包函数
def outer(a, b): # a = 10 # b = 100 def my_max(): if a > b: return a return b return my_max res = outer(2, 20) # res => my_max的内存地址 print(res()) # res()即等同于my_max() print(res()) # my_max() # 只需要传参一次,就可以一直使用