python中的生成器是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
生成器,是一个用来创建迭代器的工具。它简单而强大,类似写函数那样进行定义,但是需要返回数据时不是使用,而是使用收益率语句。
<强>生成器函数强>
用收益率语句返回数据的“函数”,称为生成器函数。我们把上一节中自定义类低改写成生成器函数
拷贝[30]:,def 低(n):, ,,,,,,,,,,for 小姐:拷贝范围(n - 1, 1, 1):, ,,,,,,,,,,,,,,油品收率小姐: ,,,,,,,,,,,,,,, ,,,…: [31]:拷贝,for 小姐:小于(5):拷贝, ,,,,,,,,,,印刷(i), ,,,…: 4 3. 2 1 0 [32]:拷贝,lt =,不及(3) # #,查看生成器对象的__iter__()和__next__ (): [33]:拷贝,lt.__iter__吗? 签名:,,,,,,lt.__iter__ () 签名:Call lt.__iter__ (* args,, * * kwargs) 类型:,,,,,,,,,,method-wrapper String 形式:,,,,& lt; method-wrapper & # 39; __iter__& # 39;, of generator object at 0 x7fc048cb8ba0> 所以:,,,,,,Implement iter(自我)。 [34]:拷贝,lt.__next__吗? 签名:,,,,,,lt.__next__ () 签名:Call lt.__next__ (* args,, * * kwargs) 类型:,,,,,,,,,,method-wrapper String 形式:,,,,& lt; method-wrapper & # 39; __next__& # 39;, of generator object at 0 x7fc048cb8ba0> 文档字符串:,,,,,,Implement 下(自我)。
通过生成器改写小于类后,代码更加简洁紧凑,因为它自动创建了__iter__()和__next__()方法,通过对循环可以遍历生成器对象。
接下来我们定义一个生成器对象lt,对这个生成器对象调下(),用每一次调用它都会从上次离开的位置回复执行(也就是记住上次执行语句时的所有数据值)。当生成器生成了所有元素(生成器终结)就会引发抛出StopIteration错误。
拷贝[53]:,lt =,不及(3) [54]:接下来,拷贝(lt) [54]:2 [55]:接下来,拷贝(lt) [55]:1 [56]:接下来,拷贝(lt) [56]:0 [57]:接下来,拷贝(lt) --------------------------------------------------- StopIteration ,,,,, Traceback (most recent  call 最后) & lt; ipython-input-37-00f31299a3f9>,拷贝;& lt; module> - - - - -祝辞,1,下一个(lt) 之前抛出StopIteration: ><强>生成器解析式强>
为了实现一些简单的生成器,我们可以不用函数的形式,而是用类似列表解析式的语法,将外层的方括号用圆括号代替即可。
生成器表达式相比完整的生成器更紧凑但较不灵活,相比等效的列表推导式则更为节省内存。比如下面的的代码,用列表表达式生成的mylist的每个元素都保存在内存中,而mygener每次迭代时才会产生一个元素。假设元素个数不是10,而100年是万甚至更多,此时生成器的内存优势会非常明显。
拷贝[41]:,mylist =,(我*小姐:for 小姐:拷贝范围(10)) [42]:拷贝mylist 出[42]:[0,1,4日,9日,16日,25日,36岁,49岁,64年,81年) [43]:拷贝,mygener =,(我*小姐:for 小姐:拷贝范围(10)) 拷贝;[44]:mygener 出[44]:& lt; generator object & lt; genexpr>, at 0 x7fc048be3bf8>生成器解析式被设计用于生成器将立即被外层函数所使用的情况,比如:
拷贝[45]:,总和(我*小姐:for 小姐:拷贝范围(10)) [45]:,285sum()括号里面我的*在范围(10)就因为我是一个生成器解析式,避免生成一个列表而占用过多内存。
同样的,下面的例子中都是使用了生成器解析式:
xvec =,(10, 20日,30) yvec =,[7日,5日,3] 总和(x * y for x, y 拷贝zip (xvec, yvec)),,,,,,,,, # dot 产品 得到math import π,罪 sine_table =, {x: sin (x *π/180),for x 拷贝范围(0,91)} 时间=unique_words 集(word , for line 拷贝page , for word 拷贝line.split ()) valedictorian =, max ((student.gpa, student.name), for student 拷贝毕业生) 时间=data & # 39;高尔夫# 39; 列表(数据[我],for 小姐:拷贝范围(len(数据)1,1,1))<强>总结
python中的生成器是什么