python中迭代和解析
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__运算符重载变得可迭代