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()多少個
八、有了迭代器,接下就可以了解生成器
生成器是一種特殊的迭代器,它比迭代器更優雅