设计网站排行榜前十名,怎么知道网站的空间服务商,wordpress工单插件,万网速成网站有哪些 功能生成器的特点是工作到一半#xff0c;就会停下来看别人干活直至有人踢它屁股#xff0c;这时它才继续往下干活。实现这一功能的精髓要用到yield。生成器是一种特殊的迭代器#xff0c;因此我们先来了解一下什么是迭代器。我们都知道著名的斐波那契数列#xff1a;1、1、2、…生成器的特点是工作到一半就会停下来看别人干活直至有人踢它屁股这时它才继续往下干活。实现这一功能的精髓要用到yield。生成器是一种特殊的迭代器因此我们先来了解一下什么是迭代器。我们都知道著名的斐波那契数列1、1、2、3、5、8、13、21、34……从第三个数开始每个数都可以由其前面的两个数相加得到这就是一个迭代过程。很显然这是一个不收敛的数列我们无法用列表或者使集合去一次性将它们提取出来。这时候如果我们把这样一个迭代过程封装成一个迭代器只有在调用一次它的时候它才进行一次迭代并且只保留当前的迭代结果这样一来程序的运行速度能得到提高同时也不会对内存造成严重的负担。迭代器可以表示一个无限大的数据流也可以表示一个有限的数据流。从代码的角度讲所有可以被next()函数调用并不断返回下一个值的对象就叫做迭代器Iterator。与迭代器相近的一个概念是可迭代对象(Iterable)凡是可用for循环遍历的对象都是可迭代对象比如list、dict和str等。但是这几个对象不是迭代器这一点在上一段已经从迭代器的特点说明不再赘述。然而世事无绝对通过iter()函数可以将它们变成迭代器。由此我们可以建立这样一个斐波那契数列生成器defgenerate():b,c 0,1while True: #a用来计数b,c c,b c #迭代公式yieldcreturn fault #出错时的返回值y generate() #产生一个生成器对象但不调用生成器for i in range(15): #调用15次print(y.__next__(),end ) #使用next()方法调用生成器print(\r) #换行操作符for i in range(9): #继续迭代print(y.__next__(), end )yield的作用是让生成器在这里暂停执行执行下一条程序指令。当下一次调用next()函数时生成器从暂停的地方继续往下执行。一次每调用一次产生一个值如下图所示这种类型的生成器并不需要参数当我们需要给生成器内部传递参数时我们需要用到send()函数因为next()函数不具备该功能。看下面这样一段代码1 defsing(word1):2 print(word1)3 whileTrue:4 word2 yield #每次调用时生成器都停留在这里5 print(word2)678 a sing(如今走过这世间)9 a.send(None) #可以替换成a.__next__()10 a.send(万般流连)上述代码如果不用while循环则没办法使每次调用的结果程序都停留在yield这里而是执行完print(word2)变结束了这使程序会报错。在第一次使用需要传递参数的生成器时我们不能直接使用send()函数传递我们想传递的参数因为此时函数停在yeild并不需要到这个参数。因此我们可以用next()函数来进行第一次调用然后再调用send()传递参数并调用。当然如果我们非要用send()函数实现第一次调用时应该传递一个空参数。运行结果如下所示至此大功告成