Python iterable、iterator、generator
2021-09-12 00:20:10 1 举报
Python iterable(可迭代对象)、iterator(迭代器)、generator(生成器)
作者其他创作
大纲/内容
__next__(): 通过对成员变量pre、cur、n的修改,返回修改后的值。 __next__主要用于计算返回值。 计算结束后还要raise StopIteration
迭代是一种手段,遍历是目的
生成器generatorgenerator对象是一种特殊的iterator函数,它会在执行过程中保存执行的上下文环境,并在下次循环中从yield语句后继续执行,生成器的标志就是yield关键字。generator不需要抛出StopIteration异常(你可以看作yield已经在内部实现了StopIteration跳出循环),函数并没有将序列项一次生成,所以generator在实现以上可以有无穷个元素,而不需要无穷的存储空间,这在内存优化方面很有用处。使用isinstance(实体名,Generator)可判断是否为生成器。生成器的两种创建方式:1、通过函数创建2、通过推导式创建,例如 g = (x*2 for x in range(10))
class
cur
生成器表达式与列表推导式的写法非常像,但区别很大,生成器每次迭代再计算下次返回的值。而列表推导式直接把列表中的数据一次性加载到内存中。
n
迭代器与列表的区别在于,构建迭代器的时候,不像列表把所有的元素一次加载到内存,而是以一种延迟计算(lazy evaluation)方式返回元素,这正是它的优点。比如列表含有一千万个整数,需要超过400M的内存,而迭代器只需要几十个字节的空间。因为它并没有把所有元素装在到内存中,而是等到调用next()方法的时候才返回该元素(按需调用call by need的方式,本质上for循环就是不断地用迭代器的next方法)。
prev
迭代器的成员属性主要用于保存迭代器的状态,包括计数器和__next__()计算所需的属性。
所以迭代器适用于哪些场景?一次顺序取值,而且数据量庞大,每个取值都是用完就被被回收,不会再有其他用途。
迭代器iterator迭代器就是实现了迭代方式的容器,如果容器中没有更多元素了,则抛出StopIteration异常。iterable对象一般只能够进行正序方式进行迭代,你可以通过为其添加__next__()/next()方法来制定不同的迭代方式,这样通过next方法封装起来的迭代对象生成器就被称作迭代器。与iterable相比iterator多了一个next()方法,next()方法用于定制for循环时具体的返回值及返回顺序以及处理StopIteration异常等等。使用isinstance(实体名,Iterator)可判断是否为迭代器
注意:字符、列表、元组、字典都是iterable,而不是迭代器iterator,所以不能next()函数来操作字符、列表、元组、字典。可以使用iter()函数来生成序列String、List、Tuple的迭代器
__iter__(): return self
0 条评论
回复 删除
下一页