【python】迭代器/生成器/可迭代对象/序列
【python】迭代器/生成器/可迭代对象/序列
序列
序列是一个可迭代对象,但可迭代对象不一定是序列;
1、支持下标访问,定义了len()方法,可以获取长度;
2、内置的序列类型有:list,str,tuple,bytes;
3、dict同样支持len()和getitem(),但是dict不属于序列类型,因为它只能根据key值查找;
enumerate
用于将一个可遍历的数据对象,例如列表/字符串/元组,组合为一个索引序列,同时列出数据和数据下标,一般用于for循环中;
语法:enumerate(sequence,[start=0])
sequence:一个序列,迭代器或其他支持迭代对象
start:下标起始位置的值
例子:i为数据下标,j为遍历数据
可迭代对象
简单理解,就是一个可以用for循环遍历的对象,列表就是一个可迭代对象;
1、所有的序列类型都是可迭代对象,映射类型的dict也是可迭代对象,文件对象等非序列也是可迭代对象;
2、自定义的对象,在实现了iter()方法或者实现了getitem()方法后,也可以成为可迭代对象;
3、iter()方法接受一个可迭代对象,返回值是一个迭代器;
如何判断一个对象是否是可迭代对象呢?
可以使用isinstance方法,但是这个方法对于实现了getitem方法的对象,返回的仍然是false,所以比较准确的是调用iter,如果不报错,说明就是可迭代对象,反之则不是;
迭代器
是一个带状态的对象
1、可以重复调用next或者使用内置函数next方法获取元素,从第一个元素开始访问,直到所有的元素访问结束,没有元素存在时,会抛出stop iteration异常;
2、迭代器只会前进,不会后退,迭代器每次调用next拿到下一个值,这是一次性消费,无法再拿到原来的值;
3、迭代器一定是一个可迭代对象;
4、一个迭代器必须实现iter方法,但是只实现了iter方法的不一定是一个迭代器;
5、自定义对象转换成迭代器,必须实现iter和next,同时实现getitem和next,也可以达到用next访问的效果,但是isinstance判断返回为false;
l是一个list是一个可迭代对象,调用iter方法,转换成了一个迭代器
重复调用next方法获取元素,每获取完一个元素,这个元素就会被消费
调用完最后一个元素,再调用一次,就会报stop iteration异常
生成器
1、它是一个迭代器;
2、是一个含有特殊关键字yield的迭代器;
3、每次生成一个值,可通过next方法获取;
生成器的实现有两种方式,一种是通过yield关键字,一种是生成器表达式;
关键字yield,用于定义生成器函数,在迭代过程中逐步产生值,而不是一次性返回所有结果,可以理解为,生成器是一个返回迭代器的特殊函数,用于迭代操作。
在函数中使用yield语句时,函数的执行将会暂停,并将yield后面的表达式作为当前迭代的值返回,然后,每次调用生成器的next方法或者使用for循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到yield语句,这样,生成器可以逐步产生值,而不需要一次性计算并返回所有结果;
这样的优势是可以按需生成,避免一次产生大量数据占用大量内存;

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)