函数对象与闭包函数


目录
  • 函数对象与闭包函数
    • 函数对象(函数名)
    • ATM框架
    • 函数的嵌套调用
    • 函数的嵌套定义
  • 闭包函数

函数对象与闭包函数

函数对象(函数名)

'''函数名遇到括号就会调用!!'''
用法1:函数名可以当作变量名赋值
    def index():
        print('from index')
    a = index
    a()  # 本质就是在调用index函数
    
用法2:函数名可以当作函数的实参
def index():
    print('from index')
def func(a)
	print(a)
    a()
    print('from func')
func(index)

用法3:函数名可以当作函数的返回值
def index():
    print('from index')
def func():
    print('from func')
    return index
res = func()
res()

用法4:函数名可以当作容器类型(内部可以存放多个数据)的元素
def index():
    print('from index')
l = [111, 222, 333, index()]
print(l)

ATM框架

def register():
    print('注册功能')
def login():
    print('登录功能')
def shopping():
    print('购物功能')
def transfer():
    print('转账功能')
def withdraw():
    print('提现功能')
def check_order():
    print('查看订单')
func_dic = {'1':register,
            '2':login,
            '3':shopping,
            '4':transfer,
            '5':withdraw,
            '6':check_order
            }
while True:
    print("""
    1.注册功能
    2.登录功能
    3.购物功能
    4.转账功能
    5.提现功能
    6.查看订单
    """)
    choice = input('请输入功能编号>>>:').strip()
    # 判断用户输入的编号在不在字典的k中
    if choice in func_dic:
        # 根据键获取值(函数名)
        func_name = func_dic.get(choice)
        # 函数名加括号调用
        func_name()
    else:
        print('功能编号不存在')
        
    # 下列代码的弊端在于功能较多时 代码过于复杂
    # if choice == '1':
    #     register()
    # elif choice == '2':
    #     login()
    # elif choice == '3':
    #     shopping()
    # else:
    #     print('写累了')

函数的嵌套调用

嵌套调用:函数内部调用其他函数
def index():
    print('from index')
def func():
    index()
    print('from func')
func()

eg:
    def my_max(a, b):
    if a > b:
        return a
    return b

def many_max(x,y,z,m):
    res = my_max(x,y)
    res1 = my_max(res,z)
    res2 = my_max(res1,m)
    return res2
ret = many_max(1,2,3,4)
print(ret)7

函数的嵌套定义

# 函数体内部定义其他函数
# 将复杂的功能全部隐藏起来 暴露一个简单的接口
def all_func(type):
    def register():
        print('注册功能')
    def login():
        print('登录功能')
    def transfer():
        print('转账功能')
    def shopping():
        print('购物功能')
    # 这里仅仅是延时嵌套定义的现象 暂不考虑优化
    if type == '1':
        register()
    elif type == '2':
        login()
    elif type == '3':
        transfer()
    elif type == '4':
        shopping()
    else:
        print('不知道啥功能')

all_func('3') # 则调用transfer()  

闭包函数

闭:定义在函数内部的函数
包:内部函数使用了外部函数名称空间中的名字、

# 只有符合上述两个特征的函数才可以称之为'闭包函数'

def outer():
    x = 222
    def index():
        print('from index', x)
    return index

# 闭包函数其实时函数传参的第二种方式
方式1: 函数体代码需要用到数据 直接在括号内定义形参即可
def index(username):
    print(username)
def my_max(a,b):
    if a > b:
        return a
    return b

方式2 : 利用闭包函数
def outer(x,y):
    x = 2
    y = 40
    def my_max():
        if x > y:
            return x
        return y
    return my_max
rex = outer(2,40)
print(res())
print(res())