1. 程式人生 > >迭代器 可迭代物件 詳解 python iterator

迭代器 可迭代物件 詳解 python iterator

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