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