您的位置:首页 > 编程语言 > Python开发

python之生成器

2016-06-04 17:26 316 查看
def repeater(value):
while True:
new = yield value
print(first, new)
if new is not None:
value = new
print('second', value)

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


>>>r = repeater(42)
>>>type(r)
<class 'generator'>
>>>next(r)
42

理论知识
生成器是一个包含
yield
关键字的函数。当被调用时,在函数中的代码不会被执行,而会返回一个迭代器。每次用next()方法请求一个值,就会执行生成器中的代码,直到遇到一个
yield
或者
return
语句。
yield
语句挂起该函数并向调用者发送回一个值,但是函数会保留足够的状态以使它被唤醒时就从停止的那点继续执行。而
return
语句意味着函数要停止执行。
调用next方法时,迭代器会返回它的下一个值。
代码分析
第一行:函数调用,返回一个迭代器,但是不会执行repeater中的代码,参数value =42。
第二行:用
next()
方法请求一个值。执行函数中的代码,直到遇到
yield
语句,也就是到第三行,
yield
语句生成值42。然后函数挂起(暂停执行,并等待重新唤起)。注意:此时new还未和yield返回值绑定。
2.继续使用
next()
方法访问


>>>next(r)
('first', None)
42


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


>>>r.send('hello')
('first', 'hello')
('second', 'hello')
'hello'


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


>>>next(r)
('first', None)
'hello'


代码分析
调用
next
方法后,
yield
返回None(value绑定值并没有改变,仍然为
hello
),并和new绑定。执行print语句。if语句判断为假.while判断为真,执行yield语句返回value的值
hello
,函数挂起。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: