Iterations python——迭代和生成器(Generators)、可

参考:、
(比较详细)
迭代和可迭代对象、生成器的区别
参考:(比较清晰)
简述:
1、str、list、set、dict、file、对象都可以看作是容器,容器都可以被迭代(用在for,while等语句中),被称为可迭代对象 。
2、可迭代对象实现了方法,该方法返回一个迭代器对象 。
3、迭代器持有一个内部状态的字段,用于记录下次迭代返回值,它实现了和方法,迭代器不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果
4、生成器是一种特殊的迭代器,它的返回值不是通过而是用yield
5、对生成器对象进行遍历时每次的一次yield送出一个值后,然后状态停止并记录在下次yield之前;而在函数中使用后会结束函数,因此,迭代器最后的返回是处理后全部数据 。从结果来看,生成器运行过程中需要的内存更小,迭代器运行的更快
6、yield之后的内容也可能执行,而后边的内容不可能会执行
7、迭代器在被实例化对象时执行一次**init(),在循环遍历时**,先调用用一次()而后边的()会被多次执行
1,迭代器协议:对象需要提供next()方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 。2,可迭代对象:实现了迭代器协议对象 。list、tuple、dict都是Iterable(可迭代对象),但不是Iterator(迭代器对象) 。但可以使用内建函数iter(),把这些都变成Iterator(可迭代器对象) 。3,for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束
下面用例子详细解释一下
区别1、迭代器和生成器可以使用next或()
a = [1,2,3]a_iter = iter(a)c = (i for i in range(3))# print(next(a))#会出现错误print(next(a_iter))print(next(c))
区别2、迭代器和生成器的对象直接显示是对象地址而不是内容
a= [0,1,2,3]b= iter([0,1,2,3])c= (i for i in a)print('a:',a)# a: [0, 1, 2, 3]print('b:',b)#b: print('c:',c) # c: at 0x000001EAD87527D8>
区别3、迭代器和生成器返回值方式
迭代器的返回是使用实现的
from itertools import isliceclass Fib:def __init__(self):self.prev = 0self.curr = 1def __iter__(self):return selfdef __next__(self):value = http://www.kingceram.com/post/self.currself.curr += self.prevself.prev = valuereturn valuef = Fib()print(list(islice(f, 0, 10)))#[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
生成器的返回是yield实现的
def fib():prev, curr = 0, 1while True:yield currprev, curr = curr, curr + prevf = fib()print(list(islice(f, 0, 10)))#[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
区别4、生成器和迭代器运行时间
迭代器:运行时间较长
【Iterationspython——迭代和生成器(Generators)、可】生成器:运行时间短
# 注释意义:第一位值-0个数-消耗时间s,根据电脑不同值可能不同# a = iter([x for x in range(80000000)]) # 8-7-19.31-8-23a = (x for x in range(80000000))# 8-7-17.61-8-21for item in a:b = item**2
区别5、定义的形式不同
迭代器若想每次执行自己定义的操作,需要重写内部的(),iter、的函数
生成器只需要将初始值放在类循环外,计算操作放在内循环内通过yield返回每一个计算后的值