迭代器 可迭代物件 詳解 python iterator
阿新 • • 發佈:2019-02-12
1.迭代器(iterator),是可以用直接用for 或其他迭代工具遍歷的東西。
2.可迭代物件(iterable),先需要內建函式iter()轉化成迭代器,然後才可以用for或其他迭代工具遍歷。常見的可迭代物件有list,set,dict,range物件(python3)等
3.之所以for,或其他東西能遍歷迭代器(或者被轉化的可迭代物件),是迭代器有 __next__(python3)(py2中直接是obj.next())方法,for 會呼叫 這個__next__方法,你也可以手工呼叫,同時build-in function 也有一個函式next()。而單純的可迭代物件,並沒有__next__方法
4.當迭代完了後,手動用next,會丟擲異常,但for 或其他工具,會自己捕獲異常。
5.檔案迭代器就是自己的可迭代物件(不信請比較他們的id)
第一段程式碼:
知識點:要判斷一個東西是否是可迭代物件,可以判斷他是不是Iterable的子類,需要先import一個東西,看下面的程式碼
#!/usr/bin/python3 # -*- coding: utf-8 -*- from collections import Iterable Sa="hello world" ListA=[1,2,3,4] n=19 RangeA=range(10) print(isinstance(Sa,Iterable))#True print(isinstance(ListA,Iterable))#True print(isinstance(n,Iterable))#False print(isinstance(RangeA,Iterable))#True
第二段程式碼:
作用:證明單純的可迭代物件沒有__next__方法,只有轉化成迭代器(自己轉,或者用for自動轉換)才可以
#!/usr/bin/python3 # -*- coding: utf-8 -*- from collections import Iterable Sa="hello world" ListA=[1,2,3] n=19 RangeA=range(10) print(isinstance(Sa,Iterable))#True print(isinstance(ListA,Iterable))#True print(isinstance(n,Iterable))#False print(isinstance(RangeA,Iterable))#True # print(ListA.__next__()) 這句話會報錯,因為ListA不是迭代器,用for可以,是因為for會自動生成迭代器 IteratorListA=iter(ListA) print(IteratorListA.__next__())#輸出1 轉化成迭代器後,可以直接呼叫__next__方法輸出1 print(next(IteratorListA))#輸出2 :也可以用build-in function print(next(IteratorListA))#輸出3 print(next(IteratorListA))#丟擲異常StopIteration
第三段程式碼:
說明有些東西的迭代器就是它本身,例如檔案迭代器.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from collections import Iterable
with open("迭代.py")as f:
print(id(f)==id(iter(f))) #True
Sa="Hi"
print(id(Sa)==id(iter(Sa)))#False,字串只是可迭代物件,不是迭代器
而檔案迭代器用一下__next__,就會換下一行,因此可以這樣訪問檔案內容
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from collections import Iterable
with open("iter.py")as f:
print(id(f)==id(iter(f))) # True
for i in f:
print(i,end='') # 會原封不動的輸出檔案內容
Sa="Hi"
print(id(Sa)==id(iter(Sa))) #False