yield基础总结
一. 一个包含yield表达式的函数,通常称为生成器。如下:counter,调用该函数生成一个生成器对象 count
1 def counter(start_at=0): 2 count = start_at 3 while True: 4 val = (yield count) # 调用next(iterator),返回count给调用方,程序挂起。下次调用next(iterator)时从此处开始执行 5 if val is not None: 6 count = val 7 else: 8 count += 1 9 10 11 if __name__ == '__main__': 12 count = counter(5) 13 next(count) # 执行到 val = (yield count),并返回count的值,程序挂起; 返回5 14 next(count) # 从上次挂起的地方往下执行。再次遇到val = (yield count),返回count值,程序再次挂起 返回6 15 count.send(9) # 从上次挂起的地方往下执行。再次遇到val = (yield count)时,返回send传入的值,程序再次挂起。并且val的值置换为send传入的值 返回9 16 17 next(count) # 从上次挂起的地方往下执行。再次遇到val = (yield count),返回count值,程序再次挂起 返回10
二. 生成器对象有几个常用的方法:
1. next(count), 对生成器对象count进行迭代:
2. count.send(9), 向生成器对象count发送一个值9。生成器对象直接返回9,并且 yield 表达式返回9.
1 def dog(): 2 print('激活生成器对象') 3 while True: 4 try: 5 food = (yield) 6 if food is not None: 7 if food == '': 8 yield '1' 9 elif food == 'a': 10 yield '2' 11 elif food == 'b': 12 yield '3' 13 else: 14 yield '4' 15 except ValueError: 16 yield '5' 17 except GeneratorExit: 18 # 回收生成器对象时调用.如使用 del 回收时,该代码块会执行 19 print('6') 20 raise StopIteration 21 22 23 24 25 if __name__ == '__main__': 26 d = dog() 27 28 print(next(d)) # None 29 print(next(d)) # None 30 31 print(d.throw(ValueError)) # 5 32 print(next(d)) # None 33 print(d.send('a')) # 2 34 print(d.close()) # None,关闭生成器。关闭后,调用next函数时,抛出StopIteration异常 35 36 next(d) # 抛出StopIteration异常
3. d.throw(ValueError),可以控制生成器执行相应的代码块
4. d.close(), 关闭生成器对象。

浙公网安备 33010602011771号