迭代器 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