迭代器和生成器

一. 迭代器Iterator

        迭代器是访问可迭代对象的工具,使用 iter(可迭代对象) 返回的对象(实例)即迭代器,可以使用 next(迭代器) 获取可迭代对象的数据。关于迭代器的常用方法总结如下:

iter(iterable)

从可迭代对象中返回一个迭代器

参数:iterable必须是一个可提供迭代器的对象(实现了__iter__方法)

next(iterator)从迭代器iterator获取下一个记录,如果无法获取下一条记录,则触发StopIteration异常

        使用迭代器遍历集合元素:iter函数返回一个迭代器,next函数依次访问迭代器中的记录,无法获取下一条记录时,触发StopIteration异常。

        

        或者在while循环外侧捕获StopIteration异常:

        

二. 生成器Generator

        生成器是指能够动态提供数据的对象,生成器对象也是可迭代对象,而且是一个迭代器。所谓动态提供数据,即要一个,给一个,而不是直接生成所有数据。因此与字典和集合(空间换时间)相反,生成器是典型的时间换空间的例子。生成器包含生成器函数和生成器表达式。

2.1 生成器函数

        含有yield语句的函数即生成器函数,此函数被调用将返回一个生成器对象。yield语句的语法即:yield 表达式。当程序遇到yield语句将返回函数调用处,再次取值时,则返回yield的位置,继续向下执行。因此生成器函数能节约计算机内存,用时间换取了空间。

        生成器函数的调用将返回一个生成器对象,生成器对象是可迭代对象:

        

        生成器对象可以像迭代器一样,使用next函数:

        

        生成器函数调用return会触发一个StopIteration异常:

        

2.2 ​​​​生成器表达式

        生成器表达式的语法形式:(表达式 for 变量 in 可迭代对象 if 真值表达式),其中 if 子句可以省略。生成器表达式即用推导式的形式生成一个生成器;

        

备注:上述例子中,由于next(gen)已经从成成器取过一个值了,再次遍历时,生成器从之前的退出状态继续运行,因此遍历的结果从4开始。

        列表推导式与生成器表达式的比较:列表推导式生成一个全新的列表,和原列表没有任何联系。        

        

        生成器表达式依赖于另外一个可迭代对象

        

三. 迭代工具函数

        Python提供了zip、enumerate作为迭代工具函数,用于生成“个性化”的可迭代对象。

3.1 zip(iter1, iter2, iter3, ...)

        返回一个由元组组成的zip对象,元组中的元素分别由iter1,iter2可迭代对象中的元素构成(元组个数由最小的可迭代对象决定)。

        

        zip函数可以作为创建字典的可迭代对象:

        

3.2 enumerate(iterable, start=0)

        生成带索引的枚举对象,返回的迭代类型为索引-值对(index-value)对;

        

        默认索引从0开始,也可用start指定:

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值