Python--31 生成器:yield

生成器

  生成器就是迭代器的一种实现,生成器的发明使得python更为简洁

  迭代器需要我们去定义一个类和实现相关方法,才可以定义一个灵活的迭代器。生成器只需要在一个普通的函数加入yield

  所谓的协同程序就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始

  生成器就是一个特殊的函数,调用可以中断可以暂停,暂停之后把控制权临时交出来,在需要的时候可以获取回来继续执行

>>> def myGen():
...     print('生成器')
...     yield 1
...     yield 2
... 
>>> myG = myGen()
>>> next(myG)
生成器
1
>>> next(myG)
2
>>> next(myG)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> for i in myGen():
...     print(i)
... 
生成器
1
2

生成器实现fibs数列

>>> def fibs():
...     a = 0
...     b = 1
...     while True:
...             a ,b = b, a + b
...             yield a
... 
>>> for each in fibs():
...     if each > 100:
...             break
...     print(each)
... 
1
1
2
3
5
8
13
21
34
55
89

列表推导式

>>> a = [i for i in range(100) if not(i % 2) and  i % 3]
>>> a
[2, 4, 8, 10, 14, 16, 20, 22, 26, 28, 32, 34, 38, 40, 44, 46, 50, 52, 56, 58, 62, 64, 68, 70, 74, 76, 80, 82, 86, 88, 92, 94, 98]

字典推导式

>>> b = {i :i % 2 == 0 for i in range(10)}
>>> b
{0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}

集合推导式

>>> c = {i for i in [1,1,2,3,4,5,6,7,8,1,2,4,5,7]}
>>> c
{1, 2, 3, 4, 5, 6, 7, 8}

生成器推导式

>>> e = (i for i in range(10))
>>> e
<generator object <genexpr> at 0x7f12d1ffdd58>
>>> next(e)
0
>>> next(e)
1
>>> sum(i for i in range(100) if i % 2)
2500

 

posted @ 2017-09-14 11:11  110528844  阅读(148)  评论(0编辑  收藏  举报