Python 基础第十一天(闭包和装饰器初识)

今日内容:

函数名的应用

闭包

装饰器的初识

装饰器的传参

1.函数名的应用

函数名是函数的名字.

本质:变量,特殊的变量。是函数的内存地址

函数名() 可以执行此函数

(1)单独打印函数名,可以得到函数的内存地址:

print(func1)  # <function func1 at 0x0000000000872378>

(2)函数名可以赋值

例:

def func2():
print(666)
#
f = func2
print(f())

(3)函数名可以作为容器类数据的元素。

例:

def f1():
print('f1')


def f2():
print('f2')


def f3():
print('f3')

l = [f1,f2,f3]
d = {'f1':f1,'f2':f2,'f3':f3}
#调用
l[0]()
d['f2']()

(4)函数可以作为参数

def f1():
print(666)
def f2(x): # x = f1
x() # f1()
f2(f1)


(5)函数名可以作为函数的返回值

def wraaper():
  def inner():
    print(666)
  return inner

ret = wraaper() # inner
ret() # inner()

#此代码的流程分析

代码由 上而下,def 设置了一个wraaper的变量名,由于没有引用变量,一直向下,到达,ret = wraaper(),看到变量赋值,优先计算等号右边的,即wraaper(),引用wraaper()函数,然后进入下一层, def inner(),记录变量名称,不走变量体,return返回inner,函数结束.return将inner返回给函数调用者,wraaper(),即ret = inner

然后运行代码inner(),然后找到局部空间内的inner函数,继续执行inner下面的内容.直到代码结束.

 

2.闭包

就是内层函数对外层函数(非全局)变量的引用。

python遇到闭包,有一个机制,会开辟一个空间,将闭包中的所有的变量等存储起来,不随着函数的结束而关闭。
闭包的完美体现:装饰器。

如何判断:内层函数名.__closure__  cell 就是=闭包

 例题

def wraaper1():
  name = '老男孩'
  def inner():
    print(name)
  inner()
  print(inner.__closure__) 

wraaper1()

# cell返回,则是闭包

name = '老男孩'
def wraaper2():
  name1 = 'alex'
  inner()

   print(name)

   print(name1)
print(inner.__closure__) # None
wraaper2()
变量name为全局变量,不属于外层函数的,所以不是闭包

装饰器初识:

什么是装饰器:

装饰器是在不改变现有函数的调用方式的情况下,对函数功能改变或者添加新的功能的新函数叫做装饰器.

也可以描述为在不改变原函数的执行的情况下,为原函数增加额外的功能

装饰器的固定格式:(被装饰函数带参数的装饰器)

def wrapper(funcl):

  def inner(*args,**kwargs):

    '''被装饰函数运行之前''

    retsalt = funcl(*args,**kwargs)

    '''被装饰函数运行之后'''

    return retsalt

  return inner

@wrapper   #funcl = wrapper(funcl)  可以理解为这个等式这种形式  @wrapper 叫做语法糖

def  funcl(a,b)

  pass

funcl()

例题:(不带参数版本)

def timmer(f): # f = func1
  def inner():
    start_time = time.time()
    f() # func1()
    time.sleep(0.3)
    end_time = time.time()
    print('此函数的执行效率%s' % (end_time - start_time))
  return inner
# 语法糖@

@timmer # func1 = timmer(func1)
def func1():
  print('你有病呀,领导,测试我的执行效率干甚。')

func1() # inner()

 

 例题(被装饰函数带参数的版本)

def timmer(f): # f = func1 函数名
  def inner(*args,**kwargs):
    start_time = time.time()
    f(*args,**kwargs)
    time.sleep(0.3)
    end_time = time.time()
    print('此函数的执行效率%s' % (end_time - start_time))
  return inner

@timmer # func1 = timmer(func1) # inner
def func1(a,b):
  print(a,b)
  print('你有病呀,领导,测试我的执行效率干甚。')

func1(a,b)

 

如果能把这个过程理解了就明白了,装饰器的基本流程.

posted @ 2018-04-02 11:49  tom2ling  阅读(132)  评论(0编辑  收藏  举报