初学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

相关文章
相关标签/搜索