day14

带参装饰器

装饰器为被装饰的函数添加新功能,需要外界的参数 

定义一个新函数def wrap(info)把装饰器嵌套在这个新函数里面 然后他的return 的结果就是装饰器外层的函数

所以@warp(参数)等于@装饰器外层的函数

系统的wraps带参装饰器:改变inner的假指向,本质外界使用的还是inner,但是打印显示的是wraps中的函数

迭代器

迭代器对象 可以不用依赖索引的取值容器  可以不依赖索引取值

可迭代对象 可以通过方法得到迭代对象  只能从前往后依次取值

可迭代对象

有__iter__()的方法对象是可迭代对象 通过__iter__()调用可以得到迭代器对象

 

 

迭代器对象

有__next__的方法为迭代器对象 迭代器对象通过__next__来取值

只能取一次一次取 当取完了就会报错StopIteration:

for循环迭代器

直接用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循环遍历取值 这样就不会抛出异常

 

posted @ 2019-04-29 22:03  huikejie  阅读(85)  评论(0编辑  收藏  举报