案例:
实现一个连续浮点数发生器FloatRange(和range类似),根据给定范围(start,end)和步长值(step)产生一些连续浮点数序列,如迭代FloatRange(3.0,4.0,0.2)可产生序列:
正向:3.0->3.2->3.4->3.6->3.8->4.0
反向:4.0->3.8->3.6->3.4->3.2->3.0
class FloatRange:
def __init__(self,start,end,step=0.1): #设置步长默认值为0.1
self.start = start
self.end = end
self.step = step
def __iter__(self): #定义正向迭代方法
t = self.start
while t <= self.end: #当数值小于等于范围最大值时,依次迭代元素
yield t
t += self.step #根据步长值自增
def __reversed__(self): #定义反向迭代方法
t = self.end
while t >= self.start: #当数值大于等于范围最小值时,依次迭代元素
yield t
t -= self.step #根据步长值自减
for x in FloatRange(1.0,10.0,0.2): #正向迭代,因为机器根据小数点加减会有误差,所以出来的结果不会精确
print(x)
for x in reversed(FloatRange(1.0,10.0,5)): #反向迭代,使用reversed的好处在于结果不会作用于原列表,而是返回新列表
print(x)
案例:
有某个文本文件,我们想读取其中某范围的内容如100~300行之间的内容,python中文本文件是可迭代对象,我们是否可以使用类似列表切片的方式得到一个100~300行文本内容的生成器?
f = open('/var/log/dmesg')
f[100:300] #可以吗?
以Linux系统下的/var/log/dmesg文件为例
from itertools import islice #使用标准库中的itertools.islice,它能返回一个迭代对象切片的生成器
f = open('/var/log/dmesg')
for line in islice(f,100,300): #截取100行到300行之间的内容
print(line)
for line in islice(f,500): #截取前500行之间的内容
print(line)
for line in islice(f,100,None): #截取100行到文件末尾之间的内容
print(line)
注意:取值数不能是负数,因为不知道文件内容有多少行,机器无法判断读取