python 生成器_Python3 迭代器与生成器

如教程所说,迭代器和生成器算是 Python 一大特色,其核心是基于迭代器协议来的。

而平时我们经常使用的 for in 循环体,本质就是迭代器协议的一大应用。

同时 Python 内置的集合类型(字符、列表、元组、字典)都已经实现了迭代器协议,所以才能使用 for in 语句进行迭代遍历。for in 循环体在遇到 StopIteration 异常时,便终止迭代和遍历。

再说下可迭代、迭代器、生成器三个概念的联系和区别。

1、可迭代概念范围最大,生成器和迭代器肯定都可迭代,但可迭代不一定都是迭代器和生成器,比如上面说到的内置集合类数据类型。可以认为,在 Python 中,只要有集合特性的,都可迭代。

2、迭代器,迭代器特点是,均可以使用 for in 和 next 逐一遍历。

3、生成器,生成器一定是迭代器,也一定可迭代。

至于 Python 中为何要引入迭代器和生成器,除了节省内存空间外,也可以显著提升代码运行速度。

自定义迭代器类示例和说明如下:

class MyIter():

def __init__(self):

#为了示例,用一个简单的列表作为需迭代的数据集合,并且私有化可视情况变为其他类型集合

self.__list1=[1,2,3,4]

self.__index=0

def __iter__(self):

#该魔法方法,必须返回一个迭代器对象,如果self已经定义了__next__()魔法方法,则只需要返回self即可

#因为如上面所述,生成器一定是迭代器

return iter(self.list1)

def __next__(self):

#此处的魔法函数,python会自动记忆每次迭代的位置,无需再使用yield来处理

#在使用next(obj)时,会自动调用该魔法方法

res=self.__list1[self.__index]

self.__index+=1

return res

以上为自定义迭代器类的机制。

下面再示例说明下,如何自定义生成器函数,因为大多数实战场景中,使用生成器函数可能会更多一些:

def my_gene_func():

index=0

li=[1,2,3,4,5]

yield li[index]

index+=1

调用以上函数时,会返回一个生成器对象,然后对该生成器对象,使用 next() 逐一返回:

gene=my_gene_func()

next(gene)

其实核心的概念还是记忆上次迭代的位置,类中直接使用 __next__ 魔法方法实现,函数中使用 yield 实现。且怀疑,类中的 __next__ 魔法方法底层也是使用 yield 来实现的。

迭代器和生成器具体应用场景,就凡是需要提升运行效率或节约内存资源,且遍历的数据是集合形式的,都可以考虑。

另外一个小众的使用场景,是变相实现协程的效果,即在同一个线程内,实现不同任务交替执行

def mytask1():

print('task1 开始执行')

'''

task code

'''

yield

def mytask2():

print('task2 开始执行')

'''

task code

'''

yield

gene1=mytask1()

gene2=mytask2()

for i in range(100):

next(gene1)

next(gene2)

闫伟超

闫伟超

yif***chaoran@163.com6个月前 (05-14)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值