Python学习Day16 装饰器

1 函数的作用域

变量查找顺序:L_E_G_B,作用域局部>外层作用域>当前模块中的全局>python内置作用域

x=10 (Global 全局变量)

def f():

  t=5 (enclosing外层作用域)

  def inner():

    count=7(local 局部作用域)

    return 1

2 高阶函数

3 闭包

  def outer()(a)a也是外部环境:

    x=10

    def inner():条件1:内部函数

      print(x)条件2:外部函数的变量

    return inner 结论:内部函数inner就是一个闭包

 

  调用:outer()()

    不可以直接inner(),是局部变量

定义:如果在一个内部函数里,对在外部作用域(但不是全局作用域)的变量进行引用,那么内部函数被认为是闭包(closure)

闭包=函数块+定义函数时的环境

*************************************************装饰器******************************************************

import time

装饰器函数,为原函数添加新的功能

def foo():#原始函数

  print(‘sss’)

 

def show_time(func):

  def wrapper():

    start_time = time.time() #记录时间戳

    func()

    end_time = time.time() 

    print('spend %s'%(end_time-start_time))

 

  return wrapper

show_time(foo)拿到wrapper内存地址,不会执行wrapper

foo=show_time(foo)

foo(),执行原函数并增加计算时间的功能

优雅写法

【@show_time 

    原函数。。。。】

 

 

 

 功能函数加参数

import time

装饰器函数

def show_time(func):

  def wrapper(*x,**y):

    start_time = time.time() #记录时间戳

    func(*x,**y)

    end_time = time.time() 

    print('spend %s'%(end_time-start_time))

 

  return wrapper

@show_time   #==(foo=show_time(foo)),将wrapper地址赋给foo

def foo(*a, *b):#原始函数

  sum = 0

  for i in a

    sum += sum

  print(sum)

foo(1,2,3,4,6,7,8)

 

装饰器加参数:

def logger(flag)

  def show_time(func):

    def wrapper(*x,**y):

      start_time = time.time() #记录时间戳

      func(*x,**y)

      end_time = time.time() 

      print('spend %s'%(end_time-start_time))

       if flag==‘true’:

        print(“日志”)

    return wrapper

return show_time

@logger('true')  #先执行logger('true'),返回showtime,再执行@showtime

posted @ 2020-04-06 17:09  小将博杨  阅读(94)  评论(0)    收藏  举报