330 函数名的应用 , 闭包, 装饰器初始

一、函数名的应用

函数名是函数的名字,本质上是个变量,特殊的变量

函数名由:函数+()组成

函数()  执行函数

1,单独打印函数名,返回的是函数的内存地址。

2函数名的赋值

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

3、函数名可以作为容器类数据的元素

def f1():
    print(666)
def f2():
    print(662)
def f3():
    print(646)        
def f4():
    print(466)
li=[f1,f2,f3,f4]  #函数名作为列表的元素,是一个变量名。
for i in li:
    i()

4,函数名可以作为参数

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

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

def f1(x):
    return x
ret=f1(5)  
print(ret)

二、闭包

闭包:内层函数对外层函数(非全局)变量的引用

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

def wrapper():
    a =666
    def inner():
        print(a)   #inner引用外层wrapper的变量a=666
    inner()
    print(inner.__closure__)
wrapper()
#666
(<cell at 0x005910D0: int object at 0x001FED90>,)
闭包:当函数开始执行时,如果遇到了闭包,他有一个机制,
他会永远开辟一个内存空间,将必包中的变量等值放入其中,不会随着函数的执行完毕而消失。
name='老男孩'
def wrapper(n):
#n=老男孩
def inner(): print(n) inner() print(inner.__closure__) wrapper(name)
#老男孩
(<cell at 0x00476410: str object at 0x0046DBB8>,)

三、装饰器初识

在不改变原函数的执行的情况下,为原函数增加额外的功能。

import
time def func1(): print('你有病呀,领导,测试我的执行效率干甚。') 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) func1 = timmer(func1) # inner func1() # inner()

 四,被装饰函数带参数的装饰器

import time
def timer(func):
    def inner(*args,**kwargs):
        start = time.time()
        re = func(*args,**kwargs)
        print(time.time() - start)
        return re
    return inner

@timer   #==> func1 = timer(func1)
def func1(a,b):
    print('in func1')

@timer   #==> func2 = timer(func2)
def func2(a):
    print('in func2 and get a:%s'%(a))
    return 'fun2 over'

func1('aaaaaa','bbbbbb')
print(func2('aaaaaa'))

 装饰器模板

def wrapper(f):
    def inner(*args,**kwargs):
        '''执行函数之前的相关操作'''
        ret = f(*args,**kwargs)
        '''执行函数之后的相关操作'''
        return ret
    return inner

 

posted @ 2018-03-31 15:06  Murray穆  阅读(139)  评论(0编辑  收藏  举报