python学习9 -迭代器,生成器

迭代:

  迭代 就是 重复做一些事情多次(就像循环),实际上,只要实现了 __iter__方法的对象,就能就行迭代。

  __iter__方法返回一个迭代器,他具有 next()方法,,在调用next()方法时,迭代器会返回下一个值,如果没有值可以返回,则会引发一个StopIteration异常。

  迭代 相对于 列表的优势:迭代 在使用时是 计算一个值时获取一个值,而列表是一次性获取所有值。如果有很多值,列表就会占用太多的内存。

  示例如下:

1 >>> class Fibs:
2     def __init__(self):
3         self.a = 0
4         self.b = 1
5     def next(self):
6         self.a ,self.b = self.b,self.a + self.b
7         return self.a
8     def __iter__(self):
9         return self

  上面的代码中,迭代器实现了__iter__方法,这个方法实际上返回迭代器本身,在很多情况下,__iter__会放到其他的会在for循环的使用的对象中。

  ps:正确的说法,一个实现了 __iter__方法的对象是可迭代的,一个实现了next方法的对象是迭代器

1 >>> fibs = Fibs()
2 >>> for f in fibs:
3     if  f > 1000:
4         print f
5         break
6 
7     
8 1597

  内建函数 iter 可以从可迭代的对象中获取迭代器。

>>> it = iter((1,2,3))
>>> it.next()
1
>>> it.next()
2
>>> it.next()
3
>>> it.next()

Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    it.next()
StopIteration

 

生成器

  含有 yield 语句的函数就叫生成器,他不想return 那样返回值(返回多个值),而是每次产生一个值,函数就会被冻结:即函数停在那点等待被激活,函数被激活后就从停止的那点开始执行。

  示例如下:

1 >>> def flatten(lis):
2     for sublist in lis:
3         for element in sublist:
4             yield element
 1 >>> for num in flatten(lis):
 2     print num
 3 
 4 1
 5 2
 6 3
 7 4
 8 5
 9 >>> list(flatten(lis))
10 [1, 2, 3, 4, 5]

 

posted @ 2017-03-16 15:30  大愚者  阅读(169)  评论(0编辑  收藏  举报