#有__next__方法的对象,都认为是可以迭代的,可通过x.__next__()来迭代,当迭代到空行会报错StopIteration f=open('e:/kangyujiao/test.txt') print(iter(f) is f) #文件本身就是迭代器 print(f.__next__(),end='') print(f.__next__(),end='') #print(f.__next__(),end='') #内置函数next,他会自动条用对象的__next__方法,给定一个可迭代对象,调用next(x)和x.__next__()是一样的,当迭代到空行会报错StopIteration f=open('e:/kangyujiao/test.txt') print(next(f),end='') print(next(f),end='') #print(next(f),end='') #当for循环开始时,会通过他传给iter内置函数,以便从可迭代对象中获得一个迭代器,返回的对象含有需要的next方法 l=[1,2,3] print(iter(l) is l) #列表不是迭代器 i=iter(l) print(i.__next__()) print(i.__next__()) print(i.__next__())
#其他迭代环境 print(sum([1,2,3,4,5])) #15 print(list(open('e:/kangyujiao/test.txt'))) #返回文件中的行组成的列表 print(tuple(open('e:/kangyujiao/test.txt'))) #返回文件中的行组成的元组 print('&&'.join(open('e:/kangyujiao/test.txt'))) #返回文件中的行组成的字符串 a,b,c,d=open('e:/kangyujiao/test.txt') #文件中的行分别赋值给a,b,c,d print(a,b,c,d) a,*b=open('e:/kangyujiao/test.txt') #文件中的第一行赋值给a,其他赋值给b print(a,b) print(set(open('e:/kangyujiao/test.txt'))) #返回文件中的行组成的集合 print({i:j for i,j in enumerate(open('e:/kangyujiao/test.txt'))}) #返回文件中的行组成的字典
#多个迭代器vs单个迭代器 #range本身不是迭代器,产生一个迭代器后,他支持多个迭代器,这些迭代器会记住他们各自的位置 r=range(3) i1=iter(r) print(next(i1)) #0 print(next(i1)) #1 i2=iter(r) print(next(i2)) #0 print(next(i2)) #1 #zip,map和filter不支持相同结果上的多个活跃迭代器 z=zip((1,2,3),(4,5,6)) i1=iter(z) i2=iter(z) print(next(i1)) #(1,4) print(next(i1)) #(2,5) print(next(i1)) #(3,6) z=map(abs, (-1,-2,-3,-4)) i1=iter(z) i2=iter(z) print(next(i1)) #1 print(next(i1)) #2 print(next(i1)) #3