码迷,mamicode.com
首页 > 其他好文 > 详细

生成器方法

时间:2016-04-23 07:05:58      阅读:575      评论:0      收藏:0      [点我收藏+]

标签:

python基础教程(p157)

生成器方法(在源代码基础上做出少许改进,以便分析代码运行步骤)

  1. def repeater(value):
  2. while True:
  3. new = (yield value)
  4. print (‘first ‘, new)
  5. if new is not None:
  6. value = new
  7. print (‘second‘, value)

1.调用函数,并且使用next()方法

  1. >>>r = repeater(42)
  2. >>>r.next()
  3. 42

理论知识
生成器是一个包含yield关键字的函数。当被调用时,在函数中的代码不会被执行,而会返回一个迭代器。每次请求一个值,就会执行生成器中的代码,直到遇到一个yield或者return语句。yield语句意味着应该生成一个值,并且函数挂起–函数停在那点等待被重新唤醒。函数被唤醒时就从停止的那点开始执行。return语句意味着生成器要停止执行。
调用next方法时,迭代器会返回它的下一个值。

代码分析
第一行:函数调用,返回一个迭代器,但是不会执行repeater中的代码,参数value =42。
第二行:用next()方法请求一个值。执行函数中的代码,直到遇到yield语句,也就是到第三行,yield语句生成值42。然后函数挂起(暂停执行,并等待重新唤起)。注意:此时new还未和yield返回值绑定。

2.继续使用next()方法访问

  1. >>> a.next()
  2. (‘first‘, None)
  3. 42

理论知识
当生成器重新(不是第一次,即之前运行过yield语句)被运行的时候,yield方法返回一个值——若调用next()方法,返回None; 若调用send方法,yield表达式返回send方法发送的值。
代码分析
调用next()方法,函数被唤醒。yield语句返回None(注意:此时value的值并没有重新绑定,仍然为42),new和返回值None绑定。执行print语句。if语句判断为假,此次循环结束。while语句判断为真,遇到yield语句,返回value值42,函数挂起。

3.使用send()方法

  1. >>> a.send(‘hello‘)
  2. (‘first‘, ‘hello‘)
  3. (‘second‘, ‘hello‘)
  4. ‘hello‘

代码分析
调用send方法后,yield返回hello(注意:value值仍然为42),并和变量new绑定,即new=hello。执行print语句。if语句判断为真,value值重新绑定为hello,并且执行print语句。while语句为真,继续循环执行代码,直到调用了yield方法,而yield方法返回value值hello,函数挂起。

4.再次使用next()方法

  1. >>>a.next()
  2. (‘first‘, None)
  3. ‘hello‘

代码分析
调用next方法后,yield返回None(value绑定值并没有改变,仍然为hello),并和new绑定。执行print语句。if语句判断为假.while判断为真,执行yield语句返回value的值hello,函数挂起。





生成器方法

标签:

原文地址:http://www.cnblogs.com/twtp/p/5423488.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!