装饰器模板:
def outter(func): #func = 被装饰对象func函数的内存地址
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper #一定不能加括号
func = outter(func) #outter(被装饰对象func函数的内存地址) ——>返回wrapper函数的内存地址
#func = wrapper函数的内存地址
func()
装饰器的语法糖:
就是在被装饰对象函数的正上方写上 @装饰函数名 就拿上面装饰器模板来说:
func = outter (func) 等同于 @outter
def func()
但装饰器函数必须在被装饰器函数上面
以上只是将被装饰函数与装饰函数的返回值,参数做到一样,若想将两个函数装饰的非常相似(此处不加也可以)则:
from functools import wraps #这是python内部提供的一些功能,为了将两个函数的一些属性做到一致
def outter(func): #func = 被装饰对象func函数的内存地址
@wraps(func)
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper #一定不能加括号
func = outter(func) outter(被装饰对象func函数的内存地址) ——>返回wrapper函数的内存地址
func = wrapper函数的内存地址
func()
若想在装饰器中添加功能,找到装饰器的核心函数,将代码加进核心函数里即可
针对以上模板,就是将实现功能的代码放进wrapper函数里就行
叠加多个装饰器
- 加载顺序(deco函数的调用顺序):自下而上
- 执行顺序(wrapper函数的执行顺序):自上而下
具体步骤如下图:
@deco3
@deco2
@deco1
def func(): #语义func=deco3(deco2(deco1(func)))
pass
什么是迭代器
迭代器指的是迭带取值得工具
什么是迭代?
迭代就是一个重复的过程,但是每一次重复都是在上一次的基础之上进行的
为何要用迭代器
1、迭代器提供了一种不依赖于索引的、通用的迭代取值方案
2、节省内存
缺点:取值不灵活,无法预知里面有多少个值,对同一个迭代器取值取完了,就完了,再想取就得重新定义一个迭代器
如何用迭代器
python中有可迭代对象与迭代器对象,内置的数据类型都是可迭代的对象
可迭代的对象
1、所有内置有__iter__方法的对象都叫可迭代的对象
只要调用可迭代对象的__iter__方法,返回的是它的迭代器
迭代器对象
1、内置有__next__方法
2、内置有__iter__方法
调用迭代器对象的__iter__方法,返回的是它自己,就跟没调用一样
调用迭代器对象的__next__方法,返回的是下一个值,不依赖索引,可以一直调用__next__直到取干净,
则抛出异常StopIteration
生成器=自定义迭代器:
利用函数创造迭代器:yield 与 return的区别,两者都是返回值,return 只能返回一次,而yield可以返回多个值
yield 可以提供一种自定义迭代器方案,可以将函数暂停住
def func():
res=1
while True:
yield res
res +=1
g = func()
next(g)
for 循环的原理代码如下:
nums_iter = iter(nums)
while True:
try :
res = next(nums_iter)
print(res)
except StopIteration:
break
其实以上代码实现的就是:
for res in nums:
print(res)
综上所述,我们遍历取值的时候,用for循环就行
新的知识点:
try:
要捕捉的内容
except 要捕捉的错误:
break