day11 初识装饰器

1闭包复习

#函数名 就是一串内存地址 可以赋值 可以作为容器类型的元素 、函数的参数和 返回值 第一类对象
# 闭包
def outer():
    a=1
    def inner():
        print(a)
    return inner
i=outer()
i()
<<<
1

2作业讲解

#2.写函数接收n个数字求这些参数数字的和
def sum_fun(*args):
    total=0
    for i in args:
        total+=i
    return total
print(sum_fun(1,2,8))
<<<
11
#读代码 回答代码中打印出来的abc分别是什么 为什么
a=10
b=20
def test5(a,b):
    print(a,b)
c=test5(b,a)
print(c)             #20,10

b=20
a=13
def test5(a,b):
    a=3
    b=5
    print(a,b)
c=test5(b,a)
print(c)             #3,5  内部有就不跟上级要了
<<<
20 10
None
3 5
None

time 模块

import time
print(time.time()) #返回当前时间的时间戳(1970纪元后经过的浮点秒数)1544769062.0091138
time.sleep(3) #让程序执行到这个位置时停一会
print('111')
<<<
1544773092.0564687
111

3初识装饰器

1.装饰器

'''装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数前后添加功能
原则:开放封闭原则  开放对拓展是开放的 对修改是封闭的
语法糖@
装饰器的固定模式'''

#timemer就是一个装饰器函数 只是对一个函数有一些装饰作用
import time
def timmer(f):           #装饰器函数
    def inner():
        start=time.time()
        ret=f()          #被装饰的函数
        end=time.time()
        print(end-start)
        return ret
    return inner

@timmer  #语法糖@ 装饰器函数名
def func(): #被装饰的函数
    time.sleep(0.01)
    print("老板好")
    return '新年好'
#func=timemer(func)  #有了@timmer 就不用这一行了
ret=func()
print(ret)

<<<
老板好
0.015593528747558594
新年好

2.封板

#封板
def outer():
    def inner():
        print('kkk')
        return 'inner'

    print('lll')
    return inner()
print(outer())

<<<
lll
kkk
inner

3.装饰带参数函数的装饰器

#装饰带参数函数的装饰器
import time
def timmer(f):
    def inner(*args,**kwargs):
        start=time.time()
        ret=f(*args,**kwargs)
        end=time.time()
        print(end-start)
        return ret
    return inner
@timmer
def func(a,b):
    time.sleep(1)
    print('老板好',a,b)
    return '新年好'
#func=timmer(func)
ret=func(1,2)  #inner(1,2)
ret1=func(1,b=3)  #inner(1,2)
print(ret,ret1)
<<<
老板好 1 2
1.0005967617034912
老板好 1 3
1.0001435279846191
新年好 新年好

4.装饰器的固定模式

#装饰器的固定模式
import time
def wrapper(f):   #wrapper是装饰器函数 f是被装饰的函数
    def inner(*args,**kwargs):
        '''在被装饰函数之前要做的事'''
        ret=f(*args,**kwargs)
        '''在被装饰函数之后要做的事'''
        return  ret
    return inner
@wrapper       #相当于func=wrapper(func)
def func(a,b):
    time.sleep(1)
    print('hhhh',a+b)
    return '666'
print(func(1,5))   #相当于inner(1,5)

<<<
hhhh 6
666
def wrapper():
    def inner():
        pass
    return inner

猜你喜欢

转载自www.cnblogs.com/hi-python/p/10119812.html