• day 12小结


    1.闭包函数

    闭包函数:闭(封闭/关闭)包(闭包函数内部的函数)--》返回闭包函数内部的函数

    import requests
    
    def f1():
        def f2():
            print('from f2')
            
        return f2
    f2 = f1()
    f2()
    ----------------------------------------------------------
    def f1(url):
        def spider():
            print(url)
            
    	return spider  # 闭包函数
    

    闭包函数:闭包函数把 闭包函数内部的变量 + 闭包函数内部的函数 这两者包裹在一起,然后通过返回值的形式返回出来

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

    def f1(url):
    	def f2():
            print(url)
            pass
        
        return f2
    res = f1(1)
    res()
    

    2.装饰器

    装饰器:装饰(新增加了一个额外的功能)

    装饰器的本质就是一个 给函数增加功能的函数

    装饰器:给函数 增加功能的函数,增加功能时要注意以下两点:

    1. 不改变原函数的源代码

    2. 不改变原函数的调用方式

    import time
    
    def index():
        """被装饰的函数"""
        print('index')
        time.sleep(1)
        
    index()
    # 增加功能:计时功能
    
    ---------------------------------------------------------
    def index():
        """被装饰的函数"""
        start = time.time()
        print('index')
        time.sleep(1)
        end = time.time()
        print(end-start)
        
    index()
    -----------------------------------------------------------
    def index():
        """被装饰的函数"""
        print('index')
        time.sleep(1)
        
        
    start = time.time()  # 获取当前时间
    index()
    end = time.time()
    print(end-start)
    
    def index1():
        print('index1')
       
    # 改变调用方式
    ---------------------------------------------------------------
    def index():
        """被装饰函数"""
        print('index')
        time.sleep(1)
        
    def time_count(func):
        start =time.time()
        func()
        end = time.time()
        print(end-start)
        
    

    1.装饰器本身是函数,只不过它用来装饰被装饰的函数

    2.装饰器装饰函数 不改变被装饰函数源代码

    3.装饰器装饰函数 不改变被装饰函数的调用方式

    # v1
    import time
    
    
    def index():
        """被装饰的函数"""
        print('index')
        time.sleep(1)
        
    # time_count装饰器:对被装饰函数计时时
    def time_count(func)  # func才是真正的index
    	"""装饰器"""
        
        def wrapper():
            start = time.time()
            func()
            end = time.time()
            print(end - start)
            
    	return wrapper
    
    index = time_count(index) # index == wrapper
    index()  # wrapper()
    ----------------------------------------------------------------------
    # v2:带返回值
    import time
    
    def index():
        """被装饰的函数"""
        print('x',x)
        print('index')
        time.sleep(1)
        
        return 'index'
    
    
    # time_count装饰器:对被装饰函数计时
    def tiem_count(func):  # func才是真正的index
        """装饰器"""
        
        def wrapper():
            start = time.time()
            res = func()  # index()
            res = func()  # index()
            end = time.time()
            print(end - start)
            
            return res
        
        return wrapper
    
    index = time_count(index)  # index == wrapper
    res = index()  # wrapper()
    print(res)
    ----------------------------------------------------------------------------
    
    # v3:加参数
    import time
    
    def index(x,y,z = 10):
        """被装饰函数"""
        print('x',x)
        print('index')
        time.sleep(1)
        
        return 'index'
    
    
    # time_count装饰器:对被装饰函数计时
    def time_count(func)  # func才是真正的index
    	"""装饰器"""
        
        def wrapper(*args,**kwargs):  # (10,20)  # *args和kwargs接收所有参数
            start = time.time()
            res = func(*args,**kwargs)  # index()  # *(10,20)  # *args和swargs打散参数传给真正的index
            end  = time.time()
            print(end - start)
            
            return res
        return wrapper
    
    index = time_count(index)  # index == wrapper
    res = index(10,20,320)  # wrapper()
    print(rse)
            
            
    

    登录装饰器:

    username_list = []
    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('user_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
    
    @login_deco  # index = login_deco(index)
    def index(x,y):
        print('index')
        print('x,y',x,y)
        
        return 213
    
    res = index(10,20)
    

    二层装饰器

    1. 用来装饰函数的,它的本质是函数
    2. 不改变函数源代码
    3. 不改变函数调用方式

    装饰器模板,如果装饰器真的不懂就记住模板

    def deco(func):
        def wrapper(*arge,**kwargs):
        	# 要加什么功能就加上去
            res = func(*args,**kwargs)
            
            return res
        
        return wrapper
    

    3.三层装饰器

    username_list = []
    
    def sanceng(role):
        def login_deco(func):
            def wrapper(*arge,**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 = username and pwd_inp == pwd
                        if sername_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)
    
    

    4.迭代器引入

    1. 整型
    2. 浮点型
    3. 字符串
    4. 列表
    5. 元组
    6. 集合
    7. 字典

    可迭代对象:含有__iter__方法的就叫可迭代对象

    迭代器:含有__iter__和___next__方法的就叫做迭代器

    print(x)
    
    print(s)
    
    with open('user_infp.txt', 'r', encoding='utf8') as fr:
        fr.__next__()
    

    生成器:含有yield关键字的函数就叫生成器

  • 相关阅读:
    POJ 1002 487-3279
    Sicily 1732 Alice and Bob (二进制最大公约数)
    左右linuxserver自己主动重启过程监控和简单的解决方案
    php禁用一些重要功能
    JAVA于Get和Post差异请求
    小强HTML5手机发展之路(52)——jquerymobile触摸互动
    《剑指offer》 相应 在线测试地址
    winform 实现选择的城市名单
    linux-ubuntu关闭防火墙
    445port入侵具体解释
  • 原文地址:https://www.cnblogs.com/LZF-190903/p/11574863.html
Copyright © 2020-2023  润新知