1. 程式人生 > >python 學習彙總25:迭代器iter( tcy)

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

是否可迭代True

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