今天看書的時候忽然看到這個想起來一直沒有怎麼使用過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