day10-闭包函数、函数装饰器

 一 什么是闭包?

闭包函数:

闭指的是:该函数是一个内部函数

包指的是:指的是该函数包含对外部作用域(非全局作用域)名字的引用

二 闭包的意义与应用
内部函数包含对外部作用域而非全局作用域的引用

提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路

        def counter():
            n=0
            def incr():
                nonlocal n
                x=n
                n+=1
                return x
            return incr

        c=counter()
        print(c())
        print(c())
        print(c())
        print(c.__closure__[0].cell_contents) #查看闭包的元素

  闭包函数实例

 1 import requests
 2 
 3 def outter(url):
 4     # url='https://www.baidu.com'
 5     def get():
 6         response=requests.get(url)
 7         if response.status_code == 200:
 8             print(response.text)
 9     return get
10 
11 baidu=outter('https://www.baidu.com')
12 python=outter('https://www.python.org')
13 
14 
15 baidu()
16 baidu()
17 
18 python()
19 python()
View Code

三、装饰器

(1)一 为何要用装饰器 

  开放封闭原则:对修改封闭,对扩展开放  
  软件的维护应该遵循开放封闭原则
  开放封闭原则指的是:
      软件一旦上线运行后对修改源代码是封闭的,对扩展功能的是开放的这就用到了装饰器

  装饰器的实现必须遵循两大原则:
      1、不修改被装饰对象的源代码
      2、不修改被装饰对象的调用方式
      装饰器其实就在遵循1和2原则的前提下为被装饰对象添加新功能

 

 (2) 什么是装饰器

装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式
装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能

 (3)装饰器的使用

  (1)无参装饰器

 1 import time
 2 def timmer(func):
 3     def wrapper(*args,**kwargs):
 4         start_time=time.time()
 5         res=func(*args,**kwargs)
 6         stop_time=time.time()
 7         print('run time is %s' %(stop_time-start_time))
 8         return res
 9     return wrapper
10 
11 @timmer
12 def foo():
13     time.sleep(3)
14     print('from foo')
15 foo()
View Code

  (2) 有参装饰器

 1 def auth(driver='file'):
 2     def auth2(func):
 3         def wrapper(*args,**kwargs):
 4             name=input("user: ")
 5             pwd=input("pwd: ")
 6 
 7             if driver == 'file':
 8                 if name == 'isetan' and pwd == '123':
 9                     print('login successful')
10                     res=func(*args,**kwargs)
11                     return res
12             elif driver == 'ldap':
13                 print('ldap')
14         return wrapper
15     return auth2
16 
17 @auth(driver='file')
18 def foo(name):
19     print(name)
20 
21 foo(’isetan')
View Code

  (4)装饰器语法

被装饰函数的正上方,单独一行
        @deco1
        @deco2
        @deco3
        def foo():
            pass
        foo=deco1(deco2(deco3(foo)))

  (5)装饰器补充

from functools import wraps

def deco(func):
    @wraps(func) #加在最内层函数正上方
    def wrapper(*args,**kwargs):
        return func(*args,**kwargs)
    return wrapper

@deco
def index():
    '''哈哈哈哈'''
    print('from index')

print(index.__doc__)

  实例

 1  import  time
 2  def tran(test):
 3      def f1():
 4          start  = time.time()
 5          test()
 6          stop = time.time()
 7          print('程序运行时间为: %s'%(stop-start))
 8      return f1
 9 
10  @ tran
11  def index():
12      time.sleep(2)
13      print('来自底层的仰望!!!!!!!!!!!!')
14 
15  index()
View Code

 

转载于:https://www.cnblogs.com/wcl0517/p/9168839.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值