zoukankan      html  css  js  c++  java
  • 闭包函数,装饰器,语法糖

    闭包函数

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

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

    使用:装饰器应用

    传参两种形式:

    闭包传参:

    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 是一个修复工具,修复的是被装饰的对象的空间

  • 相关阅读:
    第51月第8天 nsdata分割
    第50月第25天 TestFlight不可用
    第50月第16日 licode libnice owt
    第50月第13天 webrtc抗丢包与带宽自适应
    第50月第12天 LiveVideoStack
    第50月第3天 webrtc fec
    第49月第29天 WebRTC GN构建工具的使用
    第49月第20天 在Mac OS X上.dylib和.so之间的区别
    iOS开发总结(A0)- make table view more responsive
    iOS开发总结(A0)- block基础知识
  • 原文地址:https://www.cnblogs.com/fxsm/p/11862731.html
Copyright © 2011-2022 走看看