今天看书的时候突然看到这个想起来一直没有怎么使用过send和next试了一下
发现了一个诡异的问题
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的值为None
然后跑去翻资料,发现自己理解错误的地方,send和next其实有一个类似的功能,就是拿一个yield的值,不同的是send是传一个进去,而next传一个None
所以第一次跑的时候,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了。