1、迭代工具包括:for循环,列表解析,in成员关系测试,及(map内置函数,sorted,zip,enumerate,filter返回可迭代对象)
2、文件迭代器
里面有一个__next__方法,每次调用时会返回文件中的下一行,当遇到文件末尾时,会引发StopIteration异常,而不是返回空字符串
f = open('script1.py)
f.__next()__
3、手动迭代:iter和next
python3.0提供了一个内置函数next,他会自动调用__next__方法。
例如:
X.next() 等价于 X.__next__()
iter(X) 内置函iter会把X转化为可迭代对象,也就是带有next的方法。
4、列表和很多其他内置对象,不是自身的迭代器,他们支持多次打开迭代器。
例如:
L = [1,2,3]
print(iter(L) is L) #输出:False
#print(L.__next__()) #会抱错
I = iter(L)
print(I.__next__()) #输出:1
print(next(L)) #输出:2
5、列表解析
[表达式 for 变量 in 目标 if 条件]
例如:
L = [1,2,3,4,5]
temp = [x*2 for x in L if x%2==0]
print(temp) #输出:[4, 8]
或者
L1 = ['a','b','c','d']
L2 = [1,2,3,4,5]
temp = [(a,b) for a in L1 for b in L2]
print(temp) #输出:[('a', 1), ('a', 2), ('a', 3), ('a', 4), ('a', 5), ('b', 1), ('b', 2), ('b', 3), ('b', 4), ('b', 5), ('c', 1), ('c', 2), ('c', 3), ('c', 4), ('c', 5), ('d', 1), ('d', 2), ('d', 3), ('d', 4), ('d', 5)]
6、sum,any,all,max,min这些函数用于任何可迭代对象
print(sum([1,2,3,4,5])) #计算和
print(any([1,2,3,4,5])) #只要所给对象是不是空,就返回True
print(all([1,2,3,4,5])) #所有对象为真时,返回True,否则返回False
print(max([1,2,3,4,5])) #计算最大值
print(min([1,2,3,4,5])) #计算最小值
7、解包:
def f(a,b,c,d):print(a,b,c,d,sep='&')
f(1,2,3,4) #输出:1&2&3&4
f(*[1,2,3,4]) #输出:1&2&3&4
unzip
x = (1,2)
y = (3,4)
print(list(zip(x,y)))#输出:[(1,3),(2,4)]
print(*zip(x,y))
a,b = zip(*zip(x,y))
print(a,b,sep=' ')
8、range返回的并不是迭代器,但是可以通过iter函数产生多个迭代器,zip,map,filter则不支持多个迭代器
例如:
L = range(5)
#print(next(L)) 报错
t = iter(L)
print(next(t)) #输出:0
print(next(t)) #输出:1
print(next(t)) #输出:2
print('*'*8) #输出:3
k = iter(L)
print(next(k)) #输出:0
print(next(k)) #输出:1
print(next(k)) #输出:2
9、字典迭代器
D = {'a':1,'b':2,'c':3}
t = iter(D)
for i in t:
print(i,end=',')
#输出:
a,b,c
10、其他迭代器
使用yield语句,用户定义的函数可以转化为可迭代的生成器函数
当编写圆括号时候,列表解析转化为可迭代生成器函数
用户定义的类通过__iter__或者__getitem__运算符重载变得可迭代