初學python裏的yield send next

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

相關文章
相關標籤/搜索