• 如何用最快的速度读出大小为10G的文件的行数?弄懂 python 的迭代器


    1 with open('rm_keys.txt', 'r', encoding = 'utf-8') as f:
    2 
    3     count = 0
    4 
    5 for line in f:
    6 
    7   count += 1
    8 
    9   print(count)

      for line in f 将文件对象 f 视为一个可迭代的数据类型,会自动使用 IO 缓存和内存管理,这样就不必担心大文件了。


    一、先理解可迭代对象的本质
      随便封装了一个可以存放多条数据的类型是不能迭代的——需要添加了__iter__方法。
      可迭代对象的本质就是提供一个这样的中间“人”即迭代器,帮助我们对其进行迭代遍历使用。
      可迭代对象是一个具备了__iter__方法的对象,通过__iter__方法获取可迭代对象的迭代器。


    二、跌代器好处:实时生成数据,节省内存


    三、迭代器的作用:具体指定下一个数据

    四、如何使用迭代器

      先获取迭代器:[可迭代对象].__iter__()
      再用next()函数来获取下一个元素

    五、判断是否是迭代器:

      from collection import Iterator
      isinstance(对象,Iterator)
      判断的依据是有没有__iter__()方法和__next__()方法

     六、for...in...循环的本质

      先得到这个可迭代对象的迭代器iter(对象)
      使用while循环不断得遍历下一个值next(迭代器)
      直到遍历到已经没有下一个值了(会报异常StopIteration)
      退出循环

    七、举个例子

    数学中有个著名的斐波拉契数列(Fibonacci)

    数列中第一个数为0,第二个数为1

    其后的每一个数都可由前两个数相加得到:

    0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

    现在我们先通过for...in...循环来遍历迭代斐波那契数列中的前n个数:

    class Fib(object):
        def __iter__(self):
            return self
    
        def __next__(self):
            pass
    
    fib = Fib()
    
    for i in fib:
        print(i)
    
    
    # 一次性的到结果:0, 1, 1, 2, 3, 5, 8, 13....

    这个斐波那契数列我们可以用迭代器来实现,

    每次迭代都通过数学计算来生成下一个数。

    使用迭代器的形式实现:

    class Fib(object):
        def __init__(self, num):
            self.num = num   # 表示前n项
            self.a = 0     # 前一个值
            self.b = 1     # 后一个值
            self.i = 0    # 次数
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.i < self.num:
                ret = self.a
                self.a, self.b = self.b, self.a+self.b
                self.i += 1
                return ret
            else:
                raise StopIteration
    
    fib = Fib(10)
    
    print(next(fib))
    print(next(fib))
    print(next(fib))
    print(next(fib))
    for i in fib:
        print(i)

    # 想要多少个就next()多少个

    八、有了迭代器,接下就可以了解生成器

      生成器是一种特殊的迭代器,它比迭代器更优雅

  • 相关阅读:
    myeclipse 8.6 安装svn插件
    最简单的jdbc程序
    win7 安装Redis
    面试问题
    在linux/unix中查找大文件
    Java:单例模式的七种写法
    JAVA设计模式之单例模式
    java_String和StringBuffer区别分析
    stringbuffer与stringbuilder的区别?
    String与StringBuffer的区别
  • 原文地址:https://www.cnblogs.com/mzfly/p/9946908.html
Copyright © 2020-2023  润新知