设计网站建设书南昌大学论文,更换动易网站模板的方法,赣州网站网站建设,专门做灯具海报的网站生成器定义在 Python 中#xff0c;使用了 yield 的函数被称为生成器#xff08;generator#xff09;。跟普通函数不同的是#xff0c;生成器是一个返回迭代器的函数#xff0c;只能用于迭代操作#xff0c;更简单点理解生成器就是一个迭代器。 在调用生成器运行的过程中…生成器定义在 Python 中使用了 yield 的函数被称为生成器generator。跟普通函数不同的是生成器是一个返回迭代器的函数只能用于迭代操作更简单点理解生成器就是一个迭代器。 在调用生成器运行的过程中每次遇到 yield 时函数会暂停并保存当前所有的运行信息返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。yield 函数创建生成器generator。yield相当于 return 返回一个值并且记住这个返回的位置下次迭代时代码从yield的下一条语句开始执行代码如下def num_generator2():yield 1yield 2yield 3gen2 num_generator2()
print(next(gen2))
print(next(gen2))
print(next(gen2))
print(next(gen2))输出
print(next(gen2))
StopIteration
1
2
3上面的代码中我们可以看到num_generator2() 是生成器函数而gen2 是生成器对象调用一次next 输出一个值生成器会记录前一次next的执行位置当next无值时抛出异常StopIterationprint(type(gen2)) 输出class generator因为通过next函数可以获取生成器对象的值所以生成器对象就是迭代器对象 执行下面代码可以证明from collections.abc import Iterator
print(isinstance(gen2,Iterator))
返回True再看一个经典的例子def demo():while True:val yield 1print(val:, val)g demo()
print(第一次执行)
print(next(g))
print(第二次执行)
print(next(g))
print(第三次执行)
print(g.send(2))输出第一次执行
1
第二次执行
val: None
1
第三次执行
val: 2
1对上面的例子进行一下分析第一次执行输出1返回了1因为 val yield 1 执行后程序就结束了所以 print(val:, val)没有被执行第二次执行输出val: None1因为记录了上次执行的位置所以val: None是while上面的print的结果val没有赋值所以是None,第二个是return的结果还是1第三次执行输出val: 21这里使用了send方法就是发送一个参数给val这次 print(val:, val)中的参数val 首先被赋值了2进行了输出然后在return 1使用生成器的原因为什么使用generator呢最重要的原因是可以按需生成并“返回”结果而不是一次性产生所有的返回值。比如对于下面的代码。NUM 100
for i in [x*x for x in range(NUM)]: # 第一种方法对列表进行迭代print(i)
for i in (x*x for x in range(NUM)): # 第二种方法对generator进行迭代print (i)上面的代码中两个for语句输出是一样的代码字面上看来也就是中括号与小括号的区别创建生成器的一个简单方法是把列表生成式的 [ ] 变为 ( )。但这点区别差异是很大的第一种方法返回值是一个列表第二个方法返回的是一个generator对象。随着NUM的变大第一种方法返回的列表也越大占用的内存也越大但是对于第二种方法没有任何区别生成器一次只能返回一个值将大大减小占用内存。生成器和迭代器的区别熟悉迭代器的同学发现生成器和迭代器很像但必定还是两个东东二者的主要区别如下1. 迭代器是访问容器的一种方式容器已经出现我们是从已有元素获取一份副本来为我们此次迭代使用而生成器则是自己生成元素的。2. 在用法上生成器只需要简单函数写法配合yield就能实现而迭代器真正开发中使用有限return和yield的区别主要有两点return作为结尾的普通函数直接返回所有结果程序终止不再运行并销毁局部变量yield会产生一个断点暂停函数挂起函数保存当前状态。并且在yield处返回某个值返回之后程序就不再往下运行了。具体的解释带yield的函数是一个生成器而不是一个函数了这个生成器有一个函数就是next函数next就相当于“下一步”生成哪个数这一次的next开始的地方是接着上一次的next停止的地方执行的所以调用next的时候生成器并不会从函数的开始执行只是接着上一步停止的地方开始然后遇到yield后return出要生成的数此步就结束。