闭包函数:
1.定义在函数内部的函数
2.包含对外部作用域名字的引用,而不是对全局作用域名字的引用(重点是理解这句话)
例如: x=1
def f1():
x=11111111111
def f2():
print(x)
return f2
此时的函数f2()就是一个闭包函数
闭包函数的应用(爬网页):
import requests
def index(url):
def get():
return requests.get(url).text
return get
python_web=index('https://www.python.org')
baidu_web=index('https://www.baidu.com')
上面为闭包函数爬不同的网页,当我们要爬这两个网页的数据的时候,直接调用python_web()或者baidu_web()
装饰器遵循的原则:1.不修改被装饰对象的源代码
2.不修改被调用对象的调用方式
装饰器的目的:在遵循1和2原则的前提下,为其它函数添加新功能
第一种:
import time
def index():
time.sleep(3)
print('welcome to index')
def home():
time.sleep(2)
print('welcome to home page')
def timmer(func):
def wrapper():
start=time.time()
func()
stop=time.time()
print('run time is %s'%(stop-start))
return wrapper
index=timmer(index)
home=timmer(home)
第二种:
import time
def timmer(func):
def wrapper():
start=time.time()
func()
stop=time.time()
print('run time is %s'%(stop-start))
return wrapper
@timmer
def index():
time.sleep(3)
print('welcome to index')
@timmer
def home():
time.sleep(2)
print('welcome to home page')
index()
home()
第一种和第二种的区别就是@符的使用,第二种方式中的@符相当于第一种的
index=timmer(index)
home=timmer(home)
装饰器修订(timmer函数)
def timmer(func):
def wrapper(*args,**kwargs):
start=time.time()
func(*args,**kwargs)
stop=time.time()
print('run time is %s'%(stop-start))
return wrapper
这样idex和home函数就可以传参数了