python高级(如何实现反向迭代及对迭代器做切片操作)

案例:

实现一个连续浮点数发生器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)

注意:取值数不能是负数,因为不知道文件内容有多少行,机器无法判断读取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值