标签:
一.列表推导式
1.列表推导式是颇具python风格的一种写法。这种写法除了高效,也更简短。
In [23]: [‘i:el‘ for i,el in enumerate(["one","two","three"])] Out[23]: [‘i:el‘, ‘i:el‘, ‘i:el‘]
enumerate是内建函数,可以让列表获得“下标”的属性。
而如果不用列表推导式,上例需要这么写
In [24]: lst = ["one","two","three"] In [25]: i = 0 In [26]: for e in lst: ....: lst[i] = ‘%d: %s‘ % (i,lst[i]) ....: i +=1 ....: In [27]: lst Out[27]: [‘0: one‘, ‘1: two‘, ‘2: three‘]
二.生成器(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
标签:
原文地址:http://www.cnblogs.com/alexkn/p/4658225.html