yield和sleep(0),yield的例句
原创不简单。转载前请注明博客链接地址。朱42555080
此代码的环境:
运行平台:Windows
Python版本:Python3.x
IDE: PyCharm
1概述
yield简单来说就是一个生成器,这样函数它记住上次返回时在函数中的位置。对于生成器第二次(或n次)调用跳转至该函数。
在学习Python爬虫的过程中,碰到了关键词——
yield
。一开始我也不能完全理解。我调查过很多博客,把这个内容搞得很复杂,很混乱。那么,在更好的理解了Java迭代器和Python生成器以及C语言的概念之后,你就可以更深入、更清晰的理解它们了。2.1是下一个)功能的详细信息
如果你对Python的yield关键字没有清晰的认识,可以先把
yield
关键字看成“return”(如果你有JAVA和C语言的基础)。这是一个类比,为了更好的理解yield关键字。言归正传,return是什么意思
在程序中返回值,返回后程序不下移。如果查完return还不知道带yield的函数看做一个是生成器(generator)的一部分
,请通过下面的函数例子更好的理解yield的用法,详细讲解程序的执行顺序和内容。Ygenerator (:print)“程序运行至今……”(while true:num=yield 1 print))num的值为:),num)YG=ygenerate 3300;
图1
其中定义了yGenerator () (yield Generator是函数名,可以自由命名))函数。函数主体有一个循环结构,函数在函数外部被函数赋值调用。下面详细介绍一步一步改变功能的执行过程。
程序运行后,由于def yGenerator()函数还没有被调用,所以会被加载(学操作系统的人应该能把此时的代码程序对比为“就绪”状态),同时继续运行程序。因为函数中包含yield关键字,所以并不实际执行yGenerator函数,而是在得到生成器yg (print(next) yg)后执行程序。此时将调用下一个方法正式执行yGenerator函数,首先执行函数的打印方法。(印刷))。然后,使用函数继续执行到while循环。程序遇到yield关键字后,指定一个yield来模拟return,return,然后程序停止(继续)。接下来,不执行任何操作,因此不执行替换num的操作。至此,下一个)yg)语句的执行就这样完成了。结果的前两行是“程序到目前为止已经运行了”。而1 ,第一行是上面while的打印结果,第二行是return给出的结果。执行(“theprogramisrunninghere,LalaLala……”),输出,然后第二次打印(next) yg)。这次和上一次一样。不同的是,根据“在哪里跌倒,就在哪里爬起来”,这个时间是从下一个节目刚刚停止的地方开始。也就是执行了num赋值操作,但是这个时代输入操作右边没有值。(因为return刚出,所以无法给出替换操作。所以此时num被赋值为None,所以num的输出结果是:None。"请注意,此时不会执行打印。语句“程序已经运行到目前为止……”是基于在哪里终止和在哪里重新运行的原则。其次,程序执行while循环后条件也满足。(因此,程序将继续运行while,并再次与yield发生碰撞。此时,return也发出1,然后程序停止。1打印功能的输出为1。2.2 yield-send)由这个返回函数给出,做了一些修改。
Ygenerator (:print)“程序运行至今……”(当true:num=yield 1 print))num的值为:),num) yg=ygenerate
图2
此时找到了num
有了值,它的变化就是把最后一句中的next()函数改为yg.send函数。首先了解一下send()函数的用法:
send是发送一个参数给num的,因为上面讲到,return的时候,并没有把1赋值给num,下次执行的时候只好继续执行赋值操作,只好赋值为None了,而如果用send的话,开始执行的时候,先接着上一次(return 1之后)执行,先把5赋值给了num,然后执行next的作用,遇见下一回的yield,return出结果后结束。
。也就是说,实际上send()函数先执行自己的send-worthy操作,然后再执行next()函数的操作。这样就可以知道为什么输出结果是5:因为send方法包含了next()方法,所以程序会继续向下运行执行print方法,然后再次进入while循环。程序执行再次遇到yield关键字,yield返回以下值后,程序再次暂停,直到再次调用下一个方法或send方法。
那么有人会问:为什么要用这个收益率生成器?因为如果使用常用列表,会占用更多的空间,比如0,1,2,3,4,5,6…100。
你可能看起来像这样:
对于in range(100): a=n此时range(100)会默认生成一个100个数的列表,所以占用内存比较大。yield生成器可以迭代,但只能读取一次。因为只有在使用的时候才会产生。例如,mygenerator=(x*x for x in range(3))。注意这里用的是(),不是数组,而上面的例子是[],大大节省了内存空间。本文到此为止。欢迎在合适的夏天批评指正自己,也欢迎大家积极评论,多交流。