生成器(generator):受内存限制,不能一次性生成所有的元素,所以使用某种算法使得推算出下一个元素即可。
可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值.
列表生成式:
>>> l = [x for x in range(100000)]
1.生成器:把[]换成()
>>> l = (x for x in range(10000))
>>> for i in l:
.... print i
2.使用yield关键字定义生成器函数:
>>> def fib(max):
... n,a,b = 0,0,1
... while n < max:
... yield b
... a,b = b,a+b
... n += 1
...
>>> fib(10)
<generator object fib at 0x7f511c3d19b0>
>>> a= fib(10)
>>> a.next()
1
>>> a.next()
1
>>> a.next()
2
>>> a.next()
3
>>> a.next()
5
迭代器(Iterator):是一个带状态的对象,可以被next()函数调用并不断返回下一个值的对象称为迭代器。
实现了iter()和next()方法。
(python 2.7 next()方法)
可以使用isinstance()判断一个对象是否是Iterator对象:
迭代器是一个更抽象的概念,任何对象,如果它的类有next方法(next python3)和iter方法返回自己本身。
每个生成器都是一个迭代器,但是反过来不行。
class Fib:
def __init__(self):
self.a = 0
self.b = 1
def __iter__(self):
return self
def next(self):
self.a,self.b = self.b,self.a+self.b
return self.a
fib = Fib()
for i in range(1,10):
print fib.next()
output:
1
1
2
3
5
8
13
21
34
source:http://nvie.com/posts/iterators-vs-generators/
可迭代对象:
list , dict,str(却不是迭代器)