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

猜你喜欢

转载自blog.csdn.net/tcy23456/article/details/84075886