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

1 with open('rm_keys.txt', 'r', encoding = 'utf-8') as f:2

3 count =04

5 for line inf:6

7count += 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个数:

classFib(object):def __iter__(self):returnselfdef __next__(self):passfib=Fib()for i infib:print(i)#一次性的到结果:0, 1, 1, 2, 3, 5, 8, 13....

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

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

使用迭代器的形式实现:

classFib(object):def __init__(self, num):

self.num= num #表示前n项

self.a = 0 #前一个值

self.b = 1 #后一个值

self.i = 0 #次数

def __iter__(self):returnselfdef __next__(self):if self.i

ret=self.a

self.a, self.b= self.b, self.a+self.b

self.i+= 1

returnretelse:raiseStopIteration

fib= Fib(10)print(next(fib))print(next(fib))print(next(fib))print(next(fib))for i infib:print(i)

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

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

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值