一、迭代器
迭代概念:
是访问集合元素的一种方式,按照某种顺序逐个访问集合中的每一项。
可迭代对象: 能够被迭代的对象,称为可迭代对象。
判定依据: 能作用于for in。
判定方法:
import collections
Isinstance(obj, collections.Iterable)
迭代器: 是可以记录遍历位置的对象,从第一个元素开始,往后通过next()函数进行遍历,只能往后,不能往前。
判定依据: 能作用于for in
判定方法: import collections
Isinstance(obj, collections.Iterator)
注意: 迭代器也是可迭代对象,所以也可以作用于for in
迭代器的优势:
- 仅仅在迭代到某个元素时,才处理该元素,在此之前,元素可以不存在。在此之后,元素可以被销毁,特别适合用于遍历一些巨大的或是无限的集合
- 提供了一个统一的访问集合的接口,可以把所有的可迭代对象,转换成迭代器进行使用。Iter(Iterable)
迭代器的简单使用: - 使用next()函数,从迭代器中取出下一个对象,从元素1 开始
- 可以直接作用与for in,内部会自动调用迭代器对象的next(),会自动处理迭代完毕的错误
迭代器注意事项:
1.如果取出完毕,再继续取,则会报错:StopIteration。
2.迭代器一般不能多次迭代。
二、装饰器
补充
偏函数:
创建一个新函数,指定我们要使用的函数的某个参数,为某个固定的值,这个新函数就是“偏函数”。
其他方式创建偏函数: import functools
高阶函数:
当一个函数A的参数,接收的又是另一个函数时,把这个函数A称为时高阶函数。比如sorted函数(排序)
使用案例: 动态计算两个数据
匿名函数:
也称为“lambda函数”
语法: lambda 参数1,参数2…:表达式,只能写一个表达式,不能用return,表达式结果就是返回值,只适用于一些简单的操作。
闭包:
在函数嵌套的前提下,内层函数引用了外层函数的变量(包括参数),外层函数又把内层函数当做返回值进行返回。这个内层函数+所引用的外层变量,称为“闭包”
注意事项:
- 闭包中,如果要修改引用的外部变量,需要使用nonlocal变量声明,否则当做是比包内,新定义的变量。
- 当闭包内,引用了一个,后期会发生变化的变量,一定要注意。
装饰器:
在函数名以及函数体不改变的前提下,给下一个函数附加一些额外代码。
开放封闭原则: 已经写好的代码尽可能不修改,如果想要新增功能,在原先代码的基础上,单独进行扩展。
装饰器: 语法糖,执行时间是立即执行。装饰器可以实现函数名不发生改变,函数体内部的代码不会发生改变。
生成器:
是一个特殊的迭代器,拥有迭代器的特性:惰性计算数据,节省内存,能够记录状态,并通过next()函数,访问下一个状态,具备可迭代特性。
创建方法:
生成器表达式:把别列表推导式[]改成()
生成器函数: 函数中包含yield语句,函数的执行结果就是生成器
产生数据的方式:
next()函数 等价于 生成器.next()
for in
send()方法 : send()方法有一个参数,指定的时上一次被刮起的yield语句的返回值,相比生成器.next(),可以额外给yield语句传值,注意第一次调用d.send(None)
生成器关闭:
注意事项: 如果碰到return,会直接终止,跑出StopIteration异常提示,生成器只会遍历一次