补充内容:
eval 将字符串变成变量名
locals 看输入的是否是字典中的一个key
func.__name____怎么看变量名的数据类型,将变量的名字转换成字符串
斐波那契数列
li=[1,1] while li[-1]<1000000: li.append(li[-1]+li[-2]) print(li) li=[1,1] while len(li)<50: li.append(li[-1]+li[-2]) print(li)
最后两个数相加变成下个数,判断什么时候停下来
装饰器:
时间模块:
import time def func(): start=time.time() .time 是时间戳 print('老板万岁') print(time.time()-start) #时间戳,小数点前是秒 time.sleep(1) 睡眠,里面是几就是几秒
前面设定的time减去执行完毕的时间,就是程序运行时间
不用原因:改了函数
二次优化:
import time def func(): print('老板万岁') start=time.time() 调用前开始计时,调用后再计算调用后时间相减 func() end = time.time() print(end-start) 优化完时间上同
不用的原因:没法给别人用
三次优化:
import time def func(): print('老板万岁') def timer(): start = time.time() func() end = time.time() print(end-start) timer()
不用的原因:改的太多
最后一次优化:装饰器
import time def qqxing(): print('老板万岁') def timer(): def inner(): start = time.time() func() end = time.time() print(end-start) return inner qqxing = timer(qqxing) qqxing()
装饰器意义,对于用户来将,感觉不到装饰器的存在
在一个函数的前后添加功能
加语法糖的装饰器
import time def timer(): def inner(): start = time.time() func() end = time.time() print(end-start) return inner @timer ------语法糖 = qqxing = timer(qqxing) def qqxing(): print('老板万岁') qqxing()
--------------------------
上个方法如果qqxing()里面有参数的话,就无法返回值
想返回值的话
当中func()要变成ret=func()并且返回ret
例子:
import time def timer(func): def inner(): start = time.time() ret = func() end = time.time() print(end-start) return ret return inner @timer def qqxing(): print('老板万岁') return 123 ret = qqxing() print(ret)
这样的话就有返回值
import time def timer(func): def inner(*args,**kwargs): start = time.time() ret = func(*args,**kwargs) end = time.time() print(end-start) return ret return inner
计算函数执行时间↑
如果想让所有函数都可以用这个装饰器
那么有的函数有可能是空值,有的有可能是有值
所以装饰器内inner接受的函数参数应该是动态参数所以要在里面加*args和**kwargs
装饰器的结构:
def timer(func): def inner(*args,**kwargs): #被装饰的函数执行之前要做的 ret = func(*args,**kwargs) #被装饰的函数 #被装饰的函数执行之后要做的 return ret return inner
装饰器面试一定会被问
def timer(func): def inner(*args,**kwargs): print('你当前正在调用',func.__name__,'函数') ret = func(*args,**kwargs)#被装饰的函数 return ret return inner @timer def welcome(name): print('welcome',name) @timeref home(): print('欢迎来到home页!') welcome('alex') home()
打印当前正在调用函数↑
装饰器遵守了开放封闭原则
开放: 对扩展是开放的
封闭: 对修改是封闭的