迭代对象这个概念是python里面非常核心的东西,我想跟大家分享一下,什么是可迭代对象。
比如我们有一个list1=[1,2,3],s='abc'
for n in list1:
print n
for c in s:
print c
其实list就是一个迭代对象,一般来说列表,字符串,可以放在for后面使用的,都是可以迭代的对象。那么为啥迭代的对象可以迭代呢。大家有没有想过这个问题,其实python里面一切皆对象。
我们一起看一个例子,比如我们用range(),range主要是处理整数,如果我们想处理float数怎么办,比如我想有一个FloatRange(0.0,1.0,0.2),起始0.0,终点1.0,步长0.2,那么功能函数该如何实现迭代器呢?
class FloatRange:def init(self,start,end,step=0.1):self.start=start self.end=end self.step=stepdef __iter__(self):
t=self.start
while t<=self.end:
yield round(t,2)
t+=self.step
(1)声明一个类FloatRange()
(2)初始化start,end和step
(3)写一个iter函数,for循环的时候就会自动调用,准确说是迭代的时候就会调用
for n in FloatRange(0.0,1.0,0.2):
print n
0.0 0.2 0.4 0.6 0.8 1.0
print list(FloatRange(0.0,1.0,0.2))[0.0,0.2,0.4,0.6,0.8,1.0]
[0.0,0.2,0.4,0.6,0.8,1.0]
那么。我为什么要和大家分享这个概念呢?我觉得弄懂这个概念对大家深入理解python之美很有帮助,此外,当你阅读别人代码时,如果有这个概念,会让你更容易理解。
最后,再介绍一下反向迭代器
l=[1,2,3,4,5] print(l[::-1])
#可以用[::-1] print(reversed(l))
#也可以用reversed关键字,生成一个反向迭代器对象,其实就是调用reversed内置函数
class FloatRange:
def init(self,start,end,step=0.1):
self.start=start
self.end=end
self.step=step
def __iter__(self):
t=self.start
while t<=self.end:
yield round(t,2)
t+=self.step
def __reversed__(self):
t=self.end
while t>=self.start
yield round(t,2)
t-=self.step
正向迭代:for x in FloatRange(1.0,2.0,0.3):print(x)
反向迭代:for x in reversed(FloatRange(1.0,2.0,0.3):print(x)
那么迭代器有什么妙用呢?
如果我们要读入一个几万行的文件,我们假设只需取100到200
方法一:readlines()函数
with open('/var/log/install.log','rb') as rf
lines=rf.readlines()
print lines[100:200]
这种方法比较暴力,而且比较浪费空间,试想一下,如果我们的文件有几个G大,那怎么办呢?
方法二:用迭代器切片。
from itertools import islice
with open('/var/log/install.log','rb') as rf:
for line in islice(rf,100,200):
print line.strip()
用标准库里的itertools.islice()返回一个生成器对象,这样读的时候是一点点读入内存空间,而不是一次性读入所有的。