zoukankan      html  css  js  c++  java
  • 函数的进阶

    函数的进阶:

    闭包函数

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

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

    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
    
  • 相关阅读:
    Easy Climb UVA
    POJ 2823 滑动窗口 单调队列模板
    Feel Good
    Problem J. Joseph’s Problem 约瑟夫问题--余数之和
    hdu 1029 Ignatius and the Princess IV
    poj 1027 Ignatius and the Princess II全排列
    Problem C Updating a Dictionary
    hdu 1412 {A}+{B}
    hdu 4006 The kth great number
    实现:职工管理系统
  • 原文地址:https://www.cnblogs.com/jimGraymane/p/11574324.html
Copyright © 2011-2022 走看看