到底什么是迭代器 生成器呢?
首先先说几个名词:
迭代(iteration):迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。称为迭代iterration 类似于遍历。数学上面的定义:迭代公式就是指用现在的值,代到一个公式里面,算出下一个值,再用下一个值代入公式,如此往复地代。
迭代对象(iterable):可以被for循环的对象就是可迭代对象,具有__iter__方法不具备__next__方法。
迭代器:(iterator):可以被next()函数调用并且不断返回下一个值的对象称为迭代器,如果没有下一个值,当迭代到空值时会抛出个异常
迭代器具备__iter__()和__next__()方法。
for循环的内部其实就是先调用_iter_()方法把iterable转换成iterator在进行循环遍历的。
自己定义迭代器,只需要在类里面加上个_iter_函数就行了,用它来返回一个带_next_方法的对象就行了。
class Iterable:
def __iter__(self):
return self
def __init__(self):
self.start=-1
def __next__(self):
self.start +=2
if self.start >10:
raise StopIteration
return self.start
I = Iterable()
for i in I:
print(i)
生成器:
生成器就是一种迭代器。生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中。
一个具备了yield语句的函数就是生成器。生成器就是一种迭代器,相对迭代器书写来说生成器更为简单。
生成器的特点:
生成器是一个函数,而且函数的参数都会保留。迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时
保留的,而不是新创建的。
yeild 生成器的运行机制:
当你问生成器要一个数时,生成器会执行,直至出现 yield 语句,生成器把
yield 的参数给你,之后生成器就不会往下继续运行。 当你问他要下一个数时,他会从上次的状态。开始运行,直至出现yield语句,把参数给你,之后停下。如此反复
生成器函数yield返回参数是返回的是一个对象,要想取值,需要调用next()方法。
迭代器与生成器之间的区别:
生成器能做到迭代器所有的事而且更加简单,更加高效,使用生成器表达式取代列解析式可以节省内存,当程序终结时会抛出异常StopIteration
通过使用生成器的语法,可以免去写迭代器类的繁琐代码
使用deepcopy()函数可以复制迭代器~~~
本人是小白一个,如果有说错的地方希望大家多多指教!我一定虚心学习!