设为首页 收藏本站
查看: 993|回复: 0

[经验分享] Python的高级特性2:列表推导式,生成器与迭代器

[复制链接]

尚未签到

发表于 2015-12-2 15:40:17 | 显示全部楼层 |阅读模式
  一.列表推导式
  1.列表推导式是颇具python风格的一种写法。这种写法除了高效,也更简短。



In [23]: {i:el for i,el in enumerate(["one","two","three"])}
Out[23]: {0: 'one', 1: 'two', 2: 'three'}

enumerate是内建函数,可以让列表获得“下标”的属性。
而如果不用列表推导式,上例需要这么写



In [24]: lst = ["one","two","three"]
In [25]: i = 0
In [26]: for e in lst:
....:     lst = '%d: %s' % (i,lst)
....:     i +=1
....:   
In [27]: lst
Out[27]: ['0: one', '1: two', '2: three']
  
   二.迭代器
  迭代器属于一个临时区,安排一些元素在里面,但只用用的时候才会创建一些临时区,一旦遍历结束则临时区清空,再遍历就失效了。所以说迭代器能够减少内存的开销。
  下面用代码来说明这句话的意思。



In [29]: import sys
In [30]: i = iter(range(10000))
In [32]: id(i.__next__())
Out[32]: 4388723488
In [33]: sys.getsizeof(i)
Out[33]: 48
In [34]: sys.getsizeof(i.__next__())
Out[34]: 28
In [35]: e = range(10000)

In [37]: sys.getsizeof(e)
Out[37]: 48
In [38]: sys.getsizeof(list(e))
Out[38]: 90112
  可以看到,如果一次性把list全部加载进来,需要90112byte内存空间,如果使用迭代器迭代,仅仅需要28byte内存空间。
  
  ps:可以被next()函数调用并不断返回下一个值的对象称为迭代器。生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator,list,tuple,dict,str是有可迭代属性(惰性循环),但如果需要转化成可迭代对象,可以用iter()来转换,验证方式就是看对象是否有__next__方法。
  
  三.生成器(generator)
  生成器是一种特殊的迭代器。
  1.什么时候需要用生成器
  其实一般情况下是不需要生成器的,只有当因为性能限制下才需要用到,比如你需要用python来read一个10g的txt文件,如果一次性把10g的文件加载到内存再处理(.read()方法),内存肯定溢出了。这里如果使用生成器,就可以把读和处理交叉进行,比如使用(.readline和.readlines)就可以在循环读取的同时不断处理,这样可以节省大量内存空间。此外,还可以使用生成器生成线程池。
  (ps:如果当自己写一个读写函数封装给别人使用时,那么要考虑到文件容量问题,此时应该考虑使用生成器。)
  
  2.生成生成器的两种方法
  2.1 第一种比较简单,将列表推导式的[]改称()就可以了



In [40]: g = (x*x for x in range(10))  
  2.2 第二种办法就是在函数里加入yield关键字。yield和return有点类似,都可以用来返回值,不同的是yield遇到next()就返回,再次执行时从上次返回的yield语句处继续执行。
  
  3.如何判断一个函数是否是生成器     
  判断生成器的办法就是查看其属性



In [41]: dir(g)
Out[41]:
['__class__',
...
'__next__',
...
'__repr__',
'__setattr__',
]
  在这里可以看到g有一个__next__的魔术方法,而这是生成器所特有的属性,下面两种方式调用都可以



In [42]: g.__next__()
Out[42]: 0
In [43]: g.__next__()
Out[43]: 1
In [44]: next(g)
Out[44]: 4
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-146469-1-1.html 上篇帖子: python定时执行任务 下篇帖子: Python web框架bottle的应用实例(static静态文件加载,Python不同模块间相互调用)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表