今天看书的时候突然看到这个想起来一直没有怎么使用过send和next试了一下
发现了一个诡异的问题
import mathdef get_primes(start):
while 1 :
if is_prime(start) :
start = yield start
start += 1def 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 Falsedef main() :
genet = get_primes(100)
for i in genet :
send(i)
print iif __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了。