前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python的迭代对象

python的迭代对象

作者头像
stormwen
发布2019-08-05 20:16:26
7520
发布2019-08-05 20:16:26
举报

迭代对象这个概念是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()返回一个生成器对象,这样读的时候是一点点读入内存空间,而不是一次性读入所有的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 googpy 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档