函数的进阶

函数的进阶:

闭包函数

闭包函数把闭包函数内部的变量+闭包函数内部的函数这两者包裹在一起,然后通过返回值的形式返回出来。这样,就能在全局进行对闭包函数内部的函数的调用

闭包函数至少得符合函数的嵌套

def f1(url):#f1就是闭包函数
    def spider():
        print(url)
    return spider
taobao=f1('www.taobao.com')
taobao()

装饰器

二层装饰器

装饰器就是对闭包函数的高级应用

装饰器的性质和特点:

​ 装饰器的本质就是一个函数

​ 装饰器的功能就是给被装饰的函数增加功能,增加功能必须满足以下两点

​ 不改变被装饰函数的代码

​ 不改变被装饰函数的调用方式

import time

username_list = []


def log_deco(index):  # 这里的index才是真正的index
    ''' 装饰器'''

    def wrapper(*args, **kwargs):  # jieshou suoyou canshu

        # username_inp,password_inp=index(*args,**kwargs)#打散参数传给真的index
        username_inp = input("请输入账号")
        password_inp = input("请输入密码")
        print('欢迎来到登陆系统')
        if username_list:
            print("你已经登陆了哦,别再登陆了")
            res = index(*args, **kwargs)
            return res
        with open('userinfo.txt', 'r', encoding='utf8')as fr:

            for user_info in fr:
                user_info = user_info.strip()
                username, password = user_info.split(':')

                if username_inp == username and password_inp == password:
                    print("登陆中", end="")
                    for i in range(5):
                        print(".", end='')
                        time.sleep(0.2)
                    print(".")
                    print('成功登陆')
                    username_list.append(username)
                    print(username_list)
                    res = index(*args, **kwargs)
                    return res

            else:
                print("失败了")

        # return res

    return wrapper

@log_deco
def index():
    '''被装饰的函数'''
    print('index')
    time.sleep(1)
    return 'index'


# index = log_deco(index)  # index==f1

while True:

 index()


三层装饰器

就是在双层的外面再加一层函数

在下面再return 一次第二层函数

三层装饰器实现了向装饰器中传参事物功能

username_list = []


def sanceng(role):
    def login_deco(func):
        def wrapper(*args, **kwargs):

            if username_list:
                print('已经登录,请勿重复登录')
                res = func(*args, **kwargs)
                return res

            username_inp = input('请输入用户名:')
            pwd_inp = input('请输入密码:')

            with open(f'{role}_info.txt', 'r', encoding='utf8') as fr:
                for user_info in fr:
                    username, pwd = user_info.strip().split(':')
                    if username_inp == username and pwd_inp == pwd:
                        print('登录成功')
                        username_list.append(username)

                        res = func(*args, **kwargs)
                        return res

                else:
                    print('登录失败')

        return wrapper

    return login_deco


@sanceng('admin')
def index(x, y):
    print('index')
    print('x,y', x, y)

    return 123


res = index(10, 20)

装饰器的模板

# 二层装饰器模板
def deco(func):
    def wrapper(*args, **kwargs):
        # 要加什么功能就加上去
        res = func(*args, **kwargs)

        return res

    return wrapper
posted @ 2019-09-23 19:47  是我,米老鼠  阅读(120)  评论(0编辑  收藏  举报