zoukankan      html  css  js  c++  java
  • 初学python里的yield send next

    今天看书的时候突然看到这个想起来一直没有怎么使用过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了。

  • 相关阅读:
    kubernetes(十九) Ceph存储入门
    Kubernetes 使用 Weave Scope 监控集群(十七)
    在Mac下安装Wordpress
    关闭 Mac 上的虚拟内存
    Underlay、Overlay、大二层介绍
    Docker For Mac 下安装 Rancher
    Minikube-Kubernetes本地环境进行开发
    minikube---kubectl常用命令
    Mac安装minikube
    java内存模型
  • 原文地址:https://www.cnblogs.com/sickboy/p/4439945.html
Copyright © 2011-2022 走看看