博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python的高级特性2:列表推导式,生成器与迭代器
阅读量:6072 次
发布时间:2019-06-20

本文共 1749 字,大约阅读时间需要 5 分钟。

一.列表推导式

  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 = 0In [26]: for e in lst:   ....:     lst[i] = '%d: %s' % (i,lst[i])   ....:     i +=1   ....:   In [27]: lstOut[27]: ['0: one', '1: two', '2: three']

 

 二.迭代器

迭代器属于一个临时区,安排一些元素在里面,但只用用的时候才会创建一些临时区,一旦遍历结束则临时区清空,再遍历就失效了。所以说迭代器能够减少内存的开销。

下面用代码来说明这句话的意思。

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

可以看到,如果一次性把list全部加载进来,需要90112byte内存空间,如果使用迭代器迭代,仅仅需要28byte内存空间。 

 

ps:可以被next()函数调用并不断返回下一个值的对象称为迭代器。生成器都是Iterator对象,但listdictstr虽然是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]: 0In [43]: g.__next__()Out[43]: 1In [44]: next(g)Out[44]: 4

 

 

转载地址:http://oingx.baihongyu.com/

你可能感兴趣的文章
Excuse me?这个前端面试在搞事!
查看>>
C#数据采集类
查看>>
quicksort
查看>>
检验函数运行时间
查看>>
【BZOJ2019】nim
查看>>
四部曲
查看>>
LINUX内核调试过程
查看>>
【HDOJ】3553 Just a String
查看>>
Java 集合深入理解(7):ArrayList
查看>>
2019年春季学期第四周作业
查看>>
linux环境配置
查看>>
ASP.NET MVC中从前台页面视图(View)传递数据到后台控制器(Controller)方式
查看>>
lintcode:next permutation下一个排列
查看>>
一个想法(续二):换个角度思考如何解决IT企业招聘难的问题!
查看>>
tomcat指定配置文件路径方法
查看>>
linux下查看各硬件型号
查看>>
对象合成复用之策略模式
查看>>
epoll的lt和et模式的实验
查看>>
Flux OOM实例
查看>>
Android的Framework分析---4硬件抽象HAL
查看>>