11,闭包,简单版装饰器。

函数名:函数名可以理解为一个特殊的变量。
直接打印函数名,得到的是函数的内存地址。

def f1():
    print(1211)
print(f1)

 

函数名可以定义为一个函数的参数。

a = 1
def f1(x):
    print(x)
f1(a)

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

 


函数名可以作为容器类型的元素。

def f1():
    print(1211)
def f2():
    print(1222)
def f3():
    print(1233)
def f4():
    print(1233)
li = [f1,f2,f3,f4,]
for i in li:
    i()


函数能作为字典的值。


函数名还可以作为函数的返回值

def f11(x):
    return x
a = f11(5)
print(a)



def f1():
print(666)
def f2(x):
return x
a = f2(f1)
a()


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

ret = wraaper()
ret()

 

什么是闭包?

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

内存函数对外层函数非全局变量的引用就叫闭包。

判断是不是闭包 用内层函数名.__closure__ 返回None

当执行一个函数时候,如果解释器判断此函数内部内部闭包存在,这样
python就一个机制,闭包的所在的临时名称空间不会随着函数的执行完毕而消失。(用于爬虫)

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

输出结果:

老男孩
(<cell at 0x00000050ABD24D38: str object at 0x00000050ABDC6BC0>,)

 

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

 

简单版本装饰器
改变了我原来执行函数的方式,不好。

import time
def login():
    time.sleep(1)
    print('嘻嘻更健康')
def timmer():
    start_time = time.time()
    login()
    end_time = time.time()
    print('此函数的执行时间是%s' % (end_time - start_time))
timmer()

虽然执行函数的方式已经无限接近于原方式,但是更麻烦了,增加了两步代码,改吧。!!!!

def login():
    time.sleep(1)
    print('嘻嘻更健康')
login()
def register():
    time.sleep(0.3)
    print('嘻嘻')
register()
def timmer(d):
    start_time = time.time()
    d()
    end_time = time.time()
    print('此函数的执行时间%s' % (end_time - start_time))
timmer(login)
timmer(register)

 

def login():
    time.sleep(0.3)
    print('洗洗更健康')
login()
def timmer(d):
    start_time = time.time()
    d()
    end_time = time.time()
    print('此函数执行了%s' % (end_time - start_time))
f1 = login #将login函数给了f1
login = timmer #将timmer函数给了login
login(f1) # timmer(login)

 

初级装饰器

def timmer(f):
    def inner():
        start_time = time.time()
        f()
        end_time = time.time()
        print('此函数的执行时间%s' % (end_time - start_time))
    return inner
@timmer
def login():
    time.sleep(0.3)
    print('嘻嘻更显康')
login()

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

def timmer(f):
    def inner():
        start_time = time.time()
        f()
        end_time = time.time()
        print('此函数的执行时间%s' % (end_time - start_time))
    return inner
@timmer
def login():
    time.sleep(0.3)
    print('嘻嘻更显康')
login()

函数带返回值的装饰器(万能装饰器)

def timmer(f):
    def inner(*args,**kwargs):
        start_time = time.time()
        ret = f(*args,**kwargs)
        end_time = time.time()
        print('此函数执行时间为%s' % (start_time - end_time))
    return inner
@timmer
def login(a,b):
    print(a,b)
    time.sleep(0.3)
    print('洗洗更健康')
    return 666
print(login(2,3))

 

装饰器

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

 

posted @ 2018-05-11 16:38  Mr~Zhang  阅读(129)  评论(0编辑  收藏  举报