专栏首页公众号:googpypython的迭代对象

python的迭代对象

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

本文分享自微信公众号 - googpy(googpy),作者:stormwen

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python的高级语法与用法(二)

    这种将数字转换成枚举类型的方法和字符串整形转换是不一样的,前者是数值访问具体枚举类型的方案,后者则是数据结构的内部转换。

    stormwen
  • Python的类的继承

    继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来类的情况下对这些类进行扩展。

    stormwen
  • Python的类和方法——成员可见性

    使用装饰器@classmethod。第一参数必须是当前类对象,该参数名一般约定为「cls」,当然cls也可以换成其他名字,通过它来传递类的属性和方法(不能传实例...

    stormwen
  • Python 强化训练:第三篇

    谢伟
  • Antd Vue的MonthPicker组件不能用,提示注册的解决方法

    项目中需要用到 Ant Design 的 MonthPicker 月份组件,但是不能用,引入后组件不能正常显示,控制台报错: vue.esm.js?efeb:6...

    德顺
  • python3实现excel里面读数据进

    py3study
  • [Leetcode][python]Unique Binary Search Trees II

    从start到end,先把左右字数的所有可能先迭代出来,之后递归加入左右字数,生成每一颗新树。

    后端技术漫谈
  • 手把手教你用深度学习做物体检测(一): 快速感受物体检测的酷炫

    如上图所示, 物体检测就是需要检测出图像中有哪些目标物体,并且框出其在图像中的位置。

    程序员一一涤生
  • 从零开始仿写一个抖音App——跨平台视频编辑SDK项目搭建

    我想看本文的人有很大一部分都是 android 工程师,所以在讲干货之前,我需要讲一讲方法论

    何时夕
  • Android扫描多媒体文件剖析

    Android扫描多媒体文件剖析 这篇文章从系统源代码分析,讲述如何将程序创建的多媒体文件加入系统的媒体库,如何从媒体库删除,以及大多数程序开发者经常遇到的无...

    用户1289394

扫码关注云+社区

领取腾讯云代金券