python中的生成器是什么

  

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]:,285

sum()括号里面我的*在范围(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中的生成器是什么