一闭三器
一闭三器:闭包、迭代器、生成器、装饰器是函数中的高端用法,特别是装饰器会用的话,会大大节省编程的内存和效率。
- 迭代器
- 如果直接在后面用魔法点类型的话,会查看该内容是否具备该类型的数据 用.__dir__()能调出该内容能使用的方法
- 迭代魔法方法 , 是否有可以被迭代的魔法方法 __iter__ 当对象有这个魔法方法的时候,就说明可以被循环
- 对循环内容在dir()可以查看能使用的方法,其中__next__ 获取里面的一个数据 对循环魔法后在使用_next\_魔法,可以发现输出一个数
- 对_next_魔法,连续输出都是一样的 但是整体打包到循环后在_next_魔法就依次输出
- 如果循环次数超过应有次数,会报错 while 异常处理 StopIteration
- for 如何判断一个数据是否可以被迭代 先判断有无_iter\_然后用__next\_进行迭代,for循环的底层逻辑是while循环
- 生成器
- 生成器是一个特殊的迭代器
- yield 把一个函数变成生成器 返回数据,并且不杀死函数
- 如果对函数next,都是第一个数
- 用变量将函数内容取出,再next就可以分别取出数据
- 循环次数多了也会报错
- 将for改成while形式就可以不受循环次数的影响了
- 优点
- 当我们需要数据的时候才给我们 节省内存
- 当需要使用一个很多的数据的时候
- 对很多数据同时操作的时候,可以不用先对数据全部取出占很多内存,他可以一个一个取出,一个一个操作
- 缺点 不可以被切片 不可以被取索引
- 另外对循环的函数取类型可以看到是generator生成器也可以使用next取值
- 闭包
- 保证数据的安全 函数运行完成,公共数据不会死亡
- 常用形式
- def func():
- def inner():
- pass
- return inner
- 如果需要具体值,使用函数内容,返回函数加()
- 例如
- 正常对列表用函数取平均值
- 如果要保证数据不被外界删改
- 可以把变量放到大函数下
- 如果返回函数不加括号则数据是本地的代码
- 返回函数加括号,在取值时用大函数加括号就可以取到函数内的实际值
- 如果返回函数不加括号,就要对函数取变量,然后再输出中再取变量括号
- 如果对数据增加,可以在大函数下操作,这样对列表的改变不会影响公共数据
- 装饰器
- 装饰函数 在不改变函数源码代码的同时为函数增加新的功能相当于在一个函数里再套一个函数,就行相当于闭包
- 例如 获取运算时间
- 如果对各种函数都取计算时间,就需要装饰器
- 首先创建装饰器,就是闭包形式
- 根据内容调整装饰器大框架
- 再对装饰器的内容进行细节调整
- 还要加上,函数对变量的复制,最后输出
- @func
- f = func(f)==@func
- 等价于 f = func(f) == inner
- @func 放在要使用的定义函数前面即可
- 可以对多个定义函数操作
- 再调整下变量名称
- 对装试函数的修改
- 对输入的修改 对inner内的函数的输入变量的改变,影响最终输出结果
- 对输出的修改 通过inner函数中返回值的修改来实现
- 例子
- 原复合函数内容 用装试函数调整后
- 把要在原函数前执行的内容就放在inner中对变量定义前执行,也就是data前,同理,在其后执行的就放在data后
- 减少重复的功能代码 属于python里面的高级应用
标签:__,编程,函数,04,魔法,第八,next,inner,迭代 From: https://www.cnblogs.com/qipaxiaopao/p/17011561.html