迭代器:

迭代器是一个更抽象的概念,任何对象,如果它的类有next方法和iter方法返回自己本身。对于string、list、dict、tuple等这类容器对象,使用for循环遍历是很方便的。

在后台for语句对容器对象调用iter()函数,iter()是python的内置函数。iter()会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内元素,

next()也是python的内置函数。在没有后续元素时,next()会抛出一个StopIteration异常。

a = iter(range(10))

print(next(a))

生成器:

生成器(Generator)是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数据的时候使用yield语句。每次next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)。

yield就是return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始

区别:

生成器能做到迭代器能做的所有事,而且因为自动创建了__iter__()和next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当生成器终结时,还会自动抛出StopIteration异常

1、共同点

生成器是一种特殊的迭代器

2、不同点

a、语法上

迭代器可以通过 iter() 内置函数创建

生成器是通过函数的形式中调用 yield 或()的形式创建的

b、用法上

迭代器在调用next()函数或for循环中,所有值被返回,没有其他过程或说动作

生成器在调用next()函数或for循环中,所有过程被执行,且返回值

#惰性求值:不要求你事先准备好整个迭代过程中所有的元素,仅在迭代至某个元素时才计算该元素

a = [i for i in range(10)] #返回列表

b = (i for i in range(10)) #返回了一个可迭代的generator (生成器)对象

print(a)print(next(b))

out:

[0,1, 2, 3, 4, 5, 6, 7, 8, 9]

0