python_August(闭包、装饰器)

yyds703 / 2024-09-06 / 原文

目录
  • 闭包函数
  • 装饰器
  • 登录装饰器

闭包函数

列如一个简单爬虫,这里的request需要从第三方库导入

# import requests	##pip install request
# response = requests.get('http://www.xiaohuar.com/')
# response.encoding = 'gb2312'	##解码方式
# data = response.text			###文本
# print(data)

##如果需要在抓或者更改网址就需要再写一遍
##如response = requests.get('http://www.xiaohuar.com/')
##如response = requests.get('http://www.baidu.com/')

使用一层包装的时候,写的稍微简洁一点了,但是还是要填同一个网址的时候重复填

import requests
def spider(url):
    response = requests.get(url)
    response.endcoding = 'gb2312'
    data = response.text
    return data
pa = spider('http://www.baidu.com/')#这里就用http就行https安全性能高,需要多次握手等,爬不出来东西
print(pa)	###可以爬出前端的一些信息

但是终极还是使用闭包,第二次使用就只需要一个f()就行

import requests
def wrapper(url):
    def spider():
        response = requests.get(url)
        response.endcoding = 'gb2312'
        data = response.text
        return data
    return spider

name = '第一次'
f = wrapper('https://www.baidu.com/')##要爬完整请改成http(不要那个s)
print(f(),f'/n**50')
print('*'*50,f"{name}")##自设计分隔符

import time
time.sleep(2)##设置时间间隔
name = '第二次'
print(f())
print('/'*50,f"{name}")##自设计分隔符

装饰器

装饰器:改变功能的时候不改变原来的调用方式,并且改变原来函数的代码

import time
### 这是一个时间验证模块
def time_count():
    start_time = time.time()##此刻时间
    time.sleep(2.4)
    end_time = time.time()##此刻时间
    timecc = (end_time - start_time)
    return timecc
##下面即为装饰器模板
def deco(func):
    def wrapper():
        res = func()
        return res
    return wrapper

f = deco(time_count)
print(f())

登录装饰器

userinfo_dict = {'nick': '123'}
is_login = False  # 定义成可变类型或者使用global

def login(func):
    def wrapper(*args, **kwargs):
        global is_login		###这里使用全局定义
        if not is_login:
            username = input('请输入你的用户名>>>').strip()
            pwd = input('请输入你的密码>>>').strip()
            if pwd == userinfo_dict.get(username):
                print('登陆成功')
                is_login = True
                res = func(*args, **kwargs)
                return res
            else:
                print('傻逼,来老子这里吃霸王餐')
        ###如果已经登录了再刷新使用程序就不用反复登录了
        else:
            res = func(*args, **kwargs)
            return res
    return wrapper

def func1():
    pass

login(func1)()