所以@warp(参数)等于@装饰器外层的函数
系统的wraps带参装饰器:改变inner的假指向,本质外界使用的还是inner,但是打印显示的是wraps中的函数
可迭代对象 可以通过方法得到迭代对象 只能从前往后依次取值
可迭代对象
有__iter__()的方法对象是可迭代对象 通过__iter__()调用可以得到迭代器对象
有__next__的方法为迭代器对象 迭代器对象通过__next__来取值
只能取一次一次取 当取完了就会报错StopIteration:
直接用while True循环在迭代器对象中通过__next__来取值 取空就报错
然后for循环就是对while迭代器对象的一种封装 当取空时候 不会报错
#for循环迭代器的工作原理:
# for v in obj: pass
# 1)获取obj.__iter__()的结果,就是得到要操作的 迭代器对象
# 2)迭代器对象通过__next__()方法进行取值,依次将当前循环的取值结果赋值给v
# 3)当取值抛异常,自动处理StopIteration异常结束取值循环
枚举对象
for v in enumerate
就是可迭代对象以及迭代器对象添加索引
通过索引与值为一个元组 被答应出来
生成器
自定义迭代器对象
就是用函数语法来声明生成器 用yield 关键字来取代return关键字来返回值 参数没有多少变化
有yield关键字的函数,函数名() 不是调用函数,而是生成得到 生成器对象,生成器对象就是迭代器对象,可以通过 __next__() 进行取值
可以通过print函数名()来打印出yield关键字返回出来的值 从上到下 先得到第一个yield的返回值 然后第二个一次类推 如果没有yield则报错StopIteration
当然可以用for循环遍历取值 这样就不会抛出异常