python 學習彙總25:迭代器iter( tcy)
迭代器 2018/6/12
目錄:
iter
1.iter
2.iter-型別判斷
3.iter-解包
itertools工具
1.itertools函式簡表 見本人相關博文
2.itertools函式詳細說明 見本人相關博文
3.itertools-tool 見本人相關博文
================================================================
1.1.概念
1).itertion迭代:
# 物件可以通過for迴圈來遍歷則稱這種遍歷為迭代
2).iterable: 可迭代物件
# 可重複迭代,滿足如下其中之一的都是iterable
(1) 可以for迴圈: for i in iterable
(2) 可index索引物件,定義__getitem__方法如list,str;
(3) 定義__iter__方法#或iter(object)
(4) 可以呼叫iter(obj)物件,並且返回一個iterator
3).iterator: 迭代器物件
# 只能迭代一次。滿足如下迭代器協議:
(1)定義__iter__方法,必須返回自身
(2)定義next方法,python3.x是__next__沒有資料丟擲StopIteration
(3)可以保持當前的狀態(不能前後移複製再次進行迭代只能重新生)
# 說明:
# 迭代器是表示資料流的物件; 這個物件一次返回一個元素的資料;
# 如果該物件不支援迭代則引發 TypeError異常
# 如果可以獲取迭代器則稱該物件為iterable。
1.2.for迴圈資料型別
# 1) 集合資料型別 如str,tuple,list,set,map,array;都會自動支援建立迭代器。
# 2) generator 和帶yield的generator function.
=================================================================
2.1. iter(object, sentinel)獲取迭代器
# 引數:
# object: 可迭代物件
# sentinel:如果__next__返回值等於sentinel丟擲StopIteration異常否則返回下一個值
2.2.迭代器得到序列
a1=[1,2,3]
a2= [('name', 'Tom'), ('sex', 'boy'), ('age', '22')]
it=iter(a1) #獲取迭代器
b1=list(it) #將迭代器物化為序列
b=tuple(it) #將迭代器物化為序列
b2=dict(iter(a2)) #{'name': 'Tom', 'age': '22', 'sex': 'boy'}
b2=dict(a2)
=================================================================
3.生成器表示式和列表
3.1.定義:
# 生成器表示式由圓括號包圍,列表解析由方括號包圍:
# ( expression for expr in sequence1 if condition1
# for expr2 in sequence2 if condition2
# for expr3 in sequence3 if condition3
# for exprN in sequenceN if conditionN )
3.2.表示式
list1 = [' line 1\n', 'line 2 \n']
# 生成器表示式 -- returns iterator
iter1 = ( line.strip() for line in list1 )
# 列表表示式 -- returns list一次實現所有值
list2 = [ line.strip() for line in list1 if line !='' ]# ['line 1', 'line 2']
#建立一個將被立即傳遞給函式的迭代器:
obj_total = sum(obj.count for obj in list_all_objects())
#迴圈次數:
seq1 = 'abc'
seq2 = (1,2,3)
[(x, y) for x in seq1 for y in seq2]#列表表示式迴圈9次;能用方括號;大括號
# [('a', 1), ('a', 2), ('a', 3),('b', 1), ('b', 2), ('b', 3),('c', 1), ('c', 2), ('c', 3)]
[(x, y) for i1, x in enumerate(seq1) for i2, y in enumerate(seq2) if i1 == i2]
# [('a', 1), ('b', 2), ('c', 3)]
================================================================
3.自定義迭代器
# 迭代物件定義iterable:可迭代物件而不iterator:迭代器
class Itertable(object):
def __init__(self, *args):
self.data = list(args)[0]
def __iter__(self):
return Iterator(self) # 並沒有返回自身
#定義迭代器
class Iterator(object): # iterator: 迭代器
def __init__(self, clsdata):
if 'Itertable' in str(type(clsdata)):
self.data = clsdata.data
else:
self.data = clsdata
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.data):
raise StopIteration
else:
data = self.data[self.index]
i=self.index
self.index += 1
return data,i
#主程式:
if __name__ == '__main__':
d = Itertable([1, 2, 3])
for x,i in d:
print (x,i,end='-')
for x in d:
print(x)
=================================================================
迭代解包Iterable Unpacking 2018/7/2 =================================================================== # 1.例項1 *a, = range(5); print(a) # [0, 1, 2, 3, 4] [*a] = range(5); print(a) # [0, 1, 2, 3, 4] *a, b, c = range(5); print(a,b,c) # [0, 1, 2] 3 4 a, *b, c = range(5); print(a,b,c) # 0 [1, 2, 3] 4 (a, b, *c) = range(5) print(a,b,c) # 0 1 [2, 3, 4] seq=range(5) a, b, c = seq[0], list(seq[1:-1]), seq[-1] print(a,b,c) # 0 [1, 2, 3] 4 a, *b, c = seq print(a,b,c) # 0 [1, 2, 3] 4 ================================================================ # 例項2: import os v, filename = os.path.split('/home/test/path/filename.pdf') # '/home/test/path', 'filename.pdf' for a, *b in [(1, 2, 3), (4, 5, 6, 7)]: # a=(1, 2, 3);b=[(4, 5, 6, 7)] print(b) # [2, 3] # [5, 6, 7] ================================================================ 2.總結: 1) 星號表示式作為賦值操作物件必須出現在元組或者列表中 2) 強制表示式都要被賦值 3) 星號表示式可以為空列表 ================================================================
判斷物件是否可迭代:
-------------------------------------------------------------------------------
1. 可迭代物件:Iterable
from collections import Iterable
isinstance('abc', Iterable) # str是否可迭代True
isinstance([1,2,3], Iterable) # list
a=[1,2]
isinstance(a,typing.Iterable) #True
isinstance(a,typing.Iterator) #False
a1=iter(a)
isinstance(a1,typing.Iterable) #True
isinstance(a1,typing.Iterator) #True
-------------------------------------------------------------------------------
2.迭代器:Iterator
from collections import Iterator
isinstance((x for x in range(10)), Iterator) #True
isinstance([], Iterator) #False
isinstance({}, Iterator) #False
isinstance('abc', Iterator) #False
-------------------------------------------------------------------------------
3.區別
可作用於for迴圈物件都是Iterable型別;
集合資料型別list、dict、str是Iterable不是Iterator,通過iter()獲得Iterator物件。
可作用於next()函式物件都是Iterator型別,惰性計算的序列;
生成器都是Iterator物件
isinstance(iter([]), Iterator) #True
isinstance(iter('abc'), Iterator) #True
-------------------------------------------------------------------------------
# 在any(iter)和all(iter)內建外掛看的迭代的內容的真值: any([0,1,0]) #True any([0,0,0]) #False all([0,0,0]) #False all([1,1,1]) #True