闭包函数
函数的传参方式(闭包函数,把变量和函数一起包起来,下次要用直接调用)
def outter(x):
def inner():
print(x)
return inner
爬虫运用闭包函数
方法一:函数
import request
def get_res(url):
res = request.get(url)
print(res.text)
get_res('https://www.baidu.com/')
get_res('https://www.taobao.com')
def func(url):
def get_res():
res = requests.get(url)
print(res.text)
return get_res
baidu_spider = func('https://www.baidu.com') # baidu_spider=get_res()
baidu_spider()
baidu_spider()
闭包函数: 传参的另外一种方式, 参数+函数包在一起返回出去
装饰器
import time
def index():
print('hello index')
time.sleep(1)
# 检测index的运行的时间,但是不能改变index的调用方式,以及index的源码
# 写一个装饰器
def deco(func): # func = 真正的index
"""装饰器"""
def f1():
start = time.time()
func() # 真正的index()
end = time.time()
print(end-start)
return f1
index = deco(index) # index = f1
index() ## 这个时候的index就是deco的参数了,真正的index在deco函数里面会调用
三层装饰器(了解)
# 三层装饰器: 给双层装饰器加参数
# 判断账号密码来自于哪个地方
def auth(engine):
def login(func):
def inner(*args, **kwargs):
# 登录功能
if engine == 'file':
username = input('usrename:')
pwd = input('pwd:')
if username == 'nick' and pwd == '123':
print('登录成功')
res = func(*args, **kwargs) # shopping()
return res
else:
print('登录失败')
elif engine == 'db':
print('账号密码来自于数据库,非法请求')
return inner
return login
@auth('file')
def shopping():
print('shopping')
# login = auth('db') # login = login
# shopping = login(shopping) # shopping = inner
shopping() # inner()