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(), 关闭生成器对象。

posted @ 2017-02-24 00:04  微光luhc  阅读(181)  评论(0)    收藏  举报