3.30 day11 装饰器

一、函数

函数名是函数的名字,本质:变量,特殊的变量。

# 1.函数名()执行次函数
# 1,单独打印函数名  <function func1 at 0x0000000000872378>
# def func1():
#     print(666)
# print(func1)  # <function func1 at 0x0000000000872378>
# a = 6
# print(a)
# 单独打印就是此函数的内存地址<function func1 at 0x1019748c8>
 
# 2.函数名的赋值
def func2():
    print(666)

f=func2
print(f()) #none因为没有return值
# 3.函数名可以作为容器类数据的元素
def f1():
    print(1211)


def f2():
    print(1233)


def f3():
    print(1299)


def f4():
    print(1233)


f1()
f2()
f3()
f4()

l1=[]

for i in range(1,5):
l1.append('f'+str(i))
print(l1)

for i in l1:
eval(i)()
# 4.函数名可以作为参数
a =1
def f1(x):
    print(x)
f1(a)

def f1():
    print(666)

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

f2(f1)
# 5.函数名可以作为函数的返回值
def f1():
    print(666)

def f2(x): #x=f1
    return x

f2(f1)()

# 不明白就当普通变量使
#6. 闭包:就是内层函数对外层函数变量(非全局)的引用
def wrapper():
    def inner():
        print(666)
    inner()
wrapper()

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

wrapper()()
# 如何判断闭包:内层函数名__closure__就是闭包
name ='laonanhai'
def wrapper():
    name1 ='alex'
    def inner():
        print(name1)
        print(name)
    inner()
    print(inner.__closure__)
wrapper()

# (<cell at 0x10212d378: str object at 0x102177e30>,)判断是闭包
# 🎈面试题:相当于把name传进去了
name ='laonanhai'
def wrapper(n):
    def inner():
        print(n)
    inner()
    print(inner.__closure__)
wrapper(name)

laonanhai
(<cell at 0x10212d378: str object at 0x102177e30>,)
# 闭包的作用,当函数开始执行时,如果遇到了闭包,他有一个机制,
# 他会永远开辟一个内存,将闭包中的变量等值放入其中不会随着函数的执行完毕而消失
# 节省内存空间
# 🍣03 装饰器:
# 作用:1.在不改变原函数的执行的情况下,为愿函数增加了额外的功能
def func1():
    print('你有病么')
import time
# print(time.time())#测试现在到1970年的时间,时间戳
start_time =(time.time())
func1()
time.sleep(0.3)
end_time =(time.time())
print('此函数的执行效率%s' % (end_time-start_time))
import time
def func1():
    print('你有病么')
func1()

def timmer(f):
    start_time= time.time()
    f()
    time.sleep(0.3)
    end_time=time.time()
    print('此函数的执行效率%s' % (end_time - start_time))

f1= func1
func1 =timmer
func1(f1)
# 无限接近原来的函数,装饰器的雏形
# 语法糖🍭
def timmer(f): #f=func1
    def inner():
        start_time= time.time()
        f()
        time.sleep(0.3)
        end_time=time.time()
        print('此函数的执行效率%s' % (end_time - start_time))
    return inner
# 语法糖🍭
@timmer #@+装饰器名字
def func1():
    print('你有病么')

# func1=timmer(func1)  #左面的func1和最开始的func1没有任何关系 等于inner timmer里面的func1是之前的func1
func1() #inner()

# 被装饰函数带参数的装饰器
def timmer(f):
    def inner(a,b):
        f(a,b)
    return inner
@timmer
def func1(a,b):
    print(a,b)

func1(1,2)
# 默写

def wrapper(func):
    def inner(*args,**kwargs):
        ret=func(*args,**kwargs)
        return ret
    return inner
@wrapper
def func(a,b,c):
    pass
print(666)

 





posted on 2018-04-02 11:40  欣蔚  阅读(101)  评论(0编辑  收藏  举报