Python学习心得第四周-04 闭包函数和装饰器
大前提:函数的作用域关系是在函数定义阶段就已经固定死的,与调用位置无关
闭包函数:
1、闭指的是-》定义在函数的内部的函数
2、包-》该内部函数包含对其外层函数作用域名字的引用
闭包函数通常需要结合函数对象的概念,将闭包函数返回到外部使用
def outter(): x=100 def inner(): print(x) return inner f=outter() # x=200 # f() def foo(): x=300 def bar(): x=400 f() bar() foo()
闭包函数的基本形式
def outter(x): def inner(): print(x) return inner
import requests#爬虫
安装requests,cmd--在python安装路径下-Scripts\
pip install requests
通过参数的形式为函数体传值
def get(url): response=requests.get(url) print(len(response.text)) x='https://www.baidu.com' get(x) get(x) get(x) y='https://www.jd.com' get(y) get(y) get(y) #将值包给函数 def outter(url): #url='https://www.jd.com' def get(): response=requests.get(url) print(len(response.text)) return get jd=outter('https://www.jd.com') jd() jd() jd() baidu=outter('https://www.baidu.com') baidu() baidu() baidu() ################ def outter(): x=1 def foo(): print(x) return foo f=outter() print(f)
装饰器
1、什么是装饰器
装饰指的是为被装饰对象添加新的功能
器指的的是工具
装饰器本身可以任意可调用的对象,被装饰的对象也可以是任意可调用的对象
目标:
写一个函数用来为另外一个函数添加新功能,需要遵循开放封闭原则(对修改是封闭的,对扩展是开放的)
1、不修改被装饰对象的源代码
2、不修改被装饰对象的调用方式
import time def index(): time.sleep(3) print('welcome to index page') def outter(func): #func=最原始index def wrapper(): start_time=time.time() func() stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return wrapper index=outter(index) #index=wrapper index() #wrapper()
import time def index(): time.sleep(0.5) print('welcome to index page') return 1234 def home(name): time.sleep(1) print('welcome %s to home page' %name) def timmer(func): #func=最原始index def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return res return wrapper # index=timmer(index) #index=wrapper # home=timmer(home) # 正常的调用 res=index() #res=wrapper() print(res) # home('egon') #wrapper('egon')
装饰器的语法糖:在被装饰对象正上方单独一行写上@装饰器名字
import time def timmer(func): #func=最原始index def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return res return wrapper @timmer #index=timmer(index) def index(): time.sleep(0.5) print('welcome to index page') return 1234 @timmer #home=timmer(home) def home(name): time.sleep(1) print('welcome %s to home page' %name) # 正常的调用 res=index() #res=wrapper() print(res) home('egon') #wrapper('egon')