# -*- encoding: utf-8 -*-
import functools
import time
'''
6、 第3章_生成器之间的交互
关键:
1 生成器的交互
生成器协议: 提供了send方法,该方法允许生成器的反向沟通。
如果使用send方法而不是next重启生成器,那么提供给send方法的值实际上能被赋予给yield表达式的结果
原理:
生成器函数执行到yield表达式,消耗生成器的代码,通过send方法给
生成器传回一个值,生成器收到了send函数传进来的这个值后,会视为是yield
表达式的执行结果
2 生成器交互的样例
def squares(cursor=1):
while True:
response = yield cursor ** 2
if response:
cursor = int(response)
else:
cursor += 1
分析:
所以这里如果send传入的值为7,那么记住:
response = yield cursor ** 2
不等同于
yield cursor ** 2
response = cursor ** 2
也就是response的值不是7 ** 2为49,而就是send传入的原始值7,
因为根据原理的描述:
生成器接受到send传入的值会被作为yield表达式的结果
如果没有通过send传入值,那么: response = yield cursor ** 2的yield表达式结果为None
参考:
Python高级编程
'''
def squares(cursor=1):
import pdb;pdb.set_trace()
while True:
response = yield cursor ** 2
if response:
cursor = int(response)
else:
cursor += 1
def useSquare():
sq = squares()
print next(sq)
print next(sq)
print sq.send(7)
print next(sq)
def process():
useSquare()
if __name__ == "__main__":
process()