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