闭包函数,装饰器,语法糖

闭包函数

定义:函数内部定义一个函数(函数嵌套定义),内部函数调用外层函数作用域引用(引用外层定义的名字)

为什么:固定获取相应数据,避免外界干扰

使用:装饰器应用

传参两种形式:

闭包传参:

def outter (): number = 100 #定义死了 def inner(): print(number) return inner inner = outter() inner ()

def outter(number): def inner (): print(number) return inner inner = outter(100) #可以随时改变传入的参数 inner()

直接传参

def inner (s): print(s) inner(100)

举个栗子:爬取某网站 间接传参:每次不用重新传入要爬取的参数 import requests def pa_chong(url): def pa (): res = requests.get(url) if res.status_code ==200: #可在里边加判断 res.text print(len(res.text)) return pa baidupa =pa_chong('https://www.baidu.com/') jd =pa_chong('https://www.jd.com') jd() 装饰器

What?装饰的工具 两大原则:开放封闭原则 开放,对函数功能的添加是开放的 封闭,对函数高性能修改是封闭的 装饰器,可以在不改变被装饰对象的源代码,以及调用方式的情况下给被装饰对象添加新功能 1,不改变装饰对象的源代码 2,不修改被装饰对象的调用方式 ps:装饰器本身是可以任意调用对象,被装饰器也是可以是任意可调用对象

为什么用装饰器? 可以解决代码冗余,提高代码的可拓展性

编写装饰器通过闭包来实现 1,计算时间装饰器 #装饰器 def code(func): def inner(args,**kwargs): a = time.time() res = func(args,**kwargs) e = time.time() print(f'用时{e - a}') return res return inner

#函数 @code #语法糖 def down (url,url2): print(f'从{url,url2}开始下载') time.sleep(3) print('下载结束') return '泷泽萝拉.ac'

down(1,2)

#认证功能装饰器 def login(func): def inner (args,**kwargs): passname =input('请输入用户名') password = input('请输入密码') if passname =='tian' and password == '123': res = func(args,**kwargs) print('登陆成功') return res else: print('账号密码有误') return inner

@login#语法糖 @code def down (url,url2): print(f'从{url,url2}开始下载') time.sleep(3) print('下载结束') return '泷泽萝拉.ac'

 

叠加多层装饰器

每一个功能都能写一个装饰器。

叠加装饰器:装饰的顺序,由下到上(由里到外),执行的顺序,由上到下

注意

无论innner出现任何判断,最终都需要返回调用后装饰对象,funnc(*arg,**kwargs)

无参装饰器#装饰被装饰对象时没有传参 def wrapper (func): @wraps(func)#传注释 def inner (args,**kwargs): #函数调用前 res = func(args,**kwargs) #函数调用后 return res return inner

有参装饰器#@wrapp(参数1) def user(leval): def wrapper(func): @wraps(func) def inner(args, **kwargs): if leval =='牛逼': 函数调用前 ​ res = func(args, kwargs) 函数调用后 ​ return res ​ else: 函数调用前 ​ res = func(*args, kwargs) 函数调用后 ​ return res ​ return inner ​ return wrapper @wraps 是一个修复工具,修复的是被装饰的对象的空间

posted @ 2019-11-14 21:35  D山仙  阅读(136)  评论(0编辑  收藏  举报