- Python匿名函数
# Demo Describe:匿名函数
'''
本章内容:
    匿名函数 lambda
        变量 = lambda 参数1,参数2,参数3.... : 返回值
'''
# start--------1,lambda----------------------
def fn(a, b):
    return a - b
rt1 = fn(50, 25)
print(rt1)  # 25
fn_lambda = lambda a, b: a - b
rt2 = fn_lambda(30, 18)
print(rt2)  # 12
# end--------1,lambda----------------------
- Python装饰器
# Demo Describe:装饰器
'''
闭包内容回顾:
    1.函数可以作为参数进行传递
    2.函数可以作为返回值进行返回
    3.函数可以作为变量进行赋值
装饰器:
    def warpper(fn):
        def inner(*args,**kwargs):
            do stuff
            ret = fn(*args,**kwargs)
            do stuff
            return ret
        return inner
    本质上是一个闭包
    作用:
        不改变原有函数的情况下,在其前后增加新功能
        比如给功能前后添加日志
'''
# start--------1,wrapper的简单使用----------------------
'''
功能
    设置一个管家,使其帮助玩家自动实现开关
'''
def guanjia(game):
    def inner():
        print('开启!')
        game()
        print('关闭!')
    return inner
'''
→@guanjia等同于 
    playLOL = guanjia(playLOL)
    playLOL()
'''
@guanjia
def playLOL():
    print('欢迎来到英雌联盟!')
@guanjia
def playPSGame():
    print('PS游戏开启!')
# playLOL()
# playPSGame()
# end--------1,wrapper的简单使用----------------------
# start--------2,wrapper的参数使用----------------------
'''
功能
    设置一个管家,使其帮助玩家自动实现开关
    动态传参
        a. *args 接受所有位置参数并存入元组
        b. **args 接受所有关键字参数并存入字典
'''
def guanjia(game):
    def inner(*args, **kwargs):
        print('开启!')
        game(*args, **kwargs)
        print('关闭!')
    return inner
# @guanjia
# def playLOL(username,pwd):
#     print('欢迎来到英雌联盟!',' 用户名:'+username,' 密码:'+pwd)
#
# @guanjia
# def playPSGame(username,pwd,gamename):
#     print('PS游戏开启!',' 用户名:'+username,' 密码:'+pwd,' 游戏名称:'+gamename)
# playLOL('xiayong','moore123')
# playPSGame('xiayong','moore123',gamename='刀剑神域')
# end--------2,wrapper的参数使用----------------------
# start--------3,wrapper的返回值使用----------------------
'''
功能
    设置一个管家,使其帮助玩家自动实现开关
    动态传参
        a. *args 接受所有位置参数并存入元组
        b. **args 接受所有关键字参数并存入字典
'''
def guanjia(game):
    def inner(*args, **kwargs):
        print('开启!')
        result = game(*args, **kwargs)
        print('关闭!')
        return result
    return inner
@guanjia
def playLOL(username, pwd):
    print('欢迎来到英雌联盟!', ' 用户名:' + username, ' 密码:' + pwd)
    return '给你奖励一个皮肤'
@guanjia
def playPSGame(username, pwd, gamename):
    print('PS游戏开启!', ' 用户名:' + username, ' 密码:' + pwd, ' 游戏名称:' + gamename)
    return '给你奖励一件神器'
# resultLOL = playLOL('xiayong','moore123')
# print(resultLOL)
# resultPSGame = playPSGame('xiayong','moore123',gamename='刀剑神域')
# print(resultPSGame)
# end--------3,wrapper的返回值使用----------------------
# start--------4,一个函数携带多个wrapper----------------------
'''
功能
    设置一个管家,使其帮助玩家自动实现开关
    动态传参
        a. *args 接受所有位置参数并存入元组
        b. **args 接受所有关键字参数并存入字典
'''
def wrapper1(fn):
    def inner(*args, **kwargs):
        print('wrapper1 IN')
        ret = fn(*args, **kwargs)
        print('wrapper1 OUT')
        return ret
    return inner
def wrapper2(fn):
    def inner(*args, **kwargs):
        print('wrapper2 IN')
        ret = fn(*args, **kwargs)
        print('wrapper2 OUT')
        return ret
    return inner
@wrapper1  # wrapper1.inner(#wrapper2.inner)
@wrapper2  # wrapper2.inner
def playPSGame(username, pwd, gamename):
    print('PS游戏开启!', ' 用户名:' + username, ' 密码:' + pwd, ' 游戏名称:' + gamename)
    return '给你奖励一件神器'
# resultPSGame = playPSGame('xiayong','moore123',gamename='刀剑神域')
# print(resultPSGame)
'''
wrapper1 IN
wrapper2 IN
PS游戏开启!  用户名:xiayong  密码:moore123  游戏名称:刀剑神域
wrapper2 OUT
wrapper1 OUT
给你奖励一件神器
'''
# end--------4,一个函数携带多个wrapper----------------------
# start--------5,demo----------------------
'''
功能
    设置一个装饰器,在用户执行数据处理操作前,需要一次登录验证
'''
loginStatus = False
def login_verify(fn):
    def inner(*args, **kwargs):
        global loginStatus
        if loginStatus == True:
            print('登录状态中,请求正在处理!')
        else:
            while 1:
                userName = input('请输入用户账号>>>')
                userPwd = input('请输入密码>>>')
                if userName == 'admin' and userPwd == '123':
                    loginStatus = True
                    print('登录成功!正在处理请求!')
                    break
                else:
                    print('录入用户信息错误!请重新登录!')
        ret = fn(*args, **kwargs)
        return ret
    return inner
@login_verify
def userAdd():
    print('新增处理!!!')
@login_verify
def userUpdate():
    print('更新处理!!!')
@login_verify
def userDelete():
    print('删除处理!!!')
userAdd()
userUpdate()
userDelete()
''' 执行结果
请输入用户账号>>>1
请输入密码>>>1
录入用户信息错误!请重新登录!
请输入用户账号>>>admin
请输入密码>>>123
登录成功!正在处理请求!
新增处理!!!
登录状态中,请求正在处理!
更新处理!!!
登录状态中,请求正在处理!
删除处理!!!
'''
# end--------4,demo----------------------