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关键字的函数就叫生成器

猜你喜欢

转载自www.cnblogs.com/LZF-190903/p/11574863.html
今日推荐