今天看书的时候忽然看到这个想起来一直没有怎么使用过send和next试了一下spa
发现了一个诡异的问题code
import math def get_primes(start): while 1 : if is_prime(start) : start = yield start start += 1 def is_prime(number): if number > 1: if number == 2: return True if number % 2 == 0: return False for current in range(3, int(math.sqrt(number) + 1), 2): if number % current == 0: return False return True return False def main() : genet = get_primes(100) for i in genet : send(i) print i if __name__ == '__main__' : main()
告诉我start的值为Noneblog
而后跑去翻资料,发现本身理解错误的地方,send和next其实有一个相似的功能,就是拿一个yield的值,不一样的是send是传一个进去,而next传一个Noneget
因此第一次跑的时候,start=100不是质数,直接过,101是质数,get_primes执行到yield停住,等带main的循环执行next,101拿出来,再用send传101进get_primes,start赋值为101,而后start加1为102,发现不是质数再加1。yield停住。而这时候main里的循环又执行到了next(倒数第一步是send),因此next传递进去的是None,这时候start就被赋值为None了。class