生成器的那些隐藏技能你肯定不知道!最详细的使…

2018-07-18 01:16:04来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

---恢复内容开始---

生成器的那些隐藏技能你肯定不知道!最详细的使用技巧详解!

 

1.避免一次性生成整个列表

避免一次性生成整个结果列表的本质是在需要的时候才逐次产生结果,而不是立即产生全部的结果,Python中有两种语言结构可以实现这种思路。

一个是生成器函数。外表看上去像是一个函数,但是没有用return语句一次性的返回整个结果对象列表,取而代之的是使用yield语句一次返回一个结果。

生成器的那些隐藏技能你肯定不知道!最详细的使用技巧详解!

 

运行的过程是这样的:生成器函数返回一个迭代器,for循环等迭代环境对这个迭代器不断调用next函数,不断的运行到下一个yield语句,逐一取得每一个返回值,直到没有yield语句可以运行,最终引发StopIteration异常。看,这个过程是不是很熟悉。

首先,下面这个例子证实了生成器函数返回的是一个迭代器 代码片段:

生成器的那些隐藏技能你肯定不知道!最详细的使用技巧详解!

 

那这么看,在for循环等真正的使用场景中使用也不难了 代码片段:

生成器的那些隐藏技能你肯定不知道!最详细的使用技巧详解!

 

2.2.状态保存

我们进一步来说说生成器函数里状态保存的话题。在每次循环的时候,生成器函数都会在yield处产生一个值,并将其返回给调用者,即for循环。然后在yield处保存内部状态,并挂起中断退出。在下一轮迭代调用时,从yield的地方继续执行,并且沿用上一轮的函数内部变量的状态,直到内部循环过程结束。

关于这个问题,具体可以看看这个例子:

生成器的那些隐藏技能你肯定不知道!最详细的使用技巧详解!

 

3.生成器表达式

再说说生成器表达式吧。

3.1.使用方法

列表解析式已经是一个不错的选择,从内存使用的角度而言,生成器更优,因为他不用一次性生成整个对象列表,这二者之间如何转化呢?

生成器表达式写法上很像列表解析式,但是外面的方括号换成了圆括号,结果大不同,简单的看看: 代码片段:

生成器的那些隐藏技能你肯定不知道!最详细的使用技巧详解!

 

代码片段:

  1. print
  2. (sorted((x **
  3. 2
  4. for
  5. x
  6. in
  7. range(
  8. 5
  9. )), reverse=
  10. True
  11. ))

运行结果:

  1. [
  2. 16
  3. ,
  4. 9
  5. ,
  6. 4
  7. ,
  8. 1
  9. ,
  10. 0
  11. ]

代码片段:

  1. print
  2. (list(x **
  3. 2
  4. for
  5. x
  6. in
  7. range(
  8. 5
  9. )))

运行结果:

  1. [
  2. 0
  3. ,
  4. 1
  5. ,
  6. 4
  7. ,
  8. 9
  9. ,
  10. 16
  11. ]

3.3.集合解析式与生成器对象

集合解析式等效于将生成器对象传入到list、set、dict等函数中作为构造参数 代码片段:

生成器的那些隐藏技能你肯定不知道!最详细的使用技巧详解!

 

谢谢阅读,进群:125240963  即可获取数十套PDF哦!

生成器的那些隐藏技能你肯定不知道!最详细的使用技巧详解!

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:网络爬虫基础知识(Python实现)

下一篇:【python】python安装和运行报错汇总