迭代器iterator
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。
迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件
特点:
访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
不能随机访问集合中的某个值 ,只能从头到尾依次访问
访问到一半时不能往回退
便于循环比较大的数据集合,节省内存
作用:
这个yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。
另外,还可通过yield实现在单线程的情况下实现并发运算的效果
判断一个对象是否是可迭代对象
''' Created on 2018年1月5日 @author: cq ''' from collections import Iterable class Obj(object): pass class Fab(object): def __init__(self, max): self.max = max self.n, self.a, self.b = 0, 0, 1 def __iter__(self): return self def next(self): if self.n < self.max: r = self.b self.a, self.b = self.b, self.a + self.b self.n = self.n + 1 return r raise StopIteration() def main(): print("Python常见对象的可迭代性") print("abc :%s" % type('abc')) print("is iterable >>",isinstance('abc',Iterable),"\n") print("123456 :%s" % type(123456)) print("is iterable >>",isinstance(123456,Iterable),"\n") print("[1,2,4,5,6] :%s" % type([1,2,4,5,6])) print("is iterable >>",isinstance([1,2,4,5,6],Iterable),"\n") print("{1,2,4,5,8,5,5,5,5} :%s" % type({1,2,4,5,8,5,5,5,5})) print("is iterable >>",isinstance({1,2,4,5,8,5,5,5,5},Iterable),"\n") print("(1,2,4,5,6,8) :%s" % type((1,2,4,5,6,8))) print("is iterable >>",isinstance((1,2,4,5,6,8),Iterable),"\n") print("{'a':1,'b':2} :%s" % type({"a":1,"b":2})) print("is iterable >>",isinstance({"a":1,"b":2},Iterable),"\n") print("Obj() :%s" % type(Obj())) print("is iterable >>",isinstance(Obj(),Iterable),"\n") print("Fab(2) :%s" % type(Fab(2))) print("is iterable >>",isinstance(Fab(2),Iterable),"\n") if __name__ == '__main__': main()
1 # 输出结果如下 2 3 Python常见对象的可迭代性 4 abc :<class 'str'> 5 is iterable >> True 6 7 123456 :<class 'int'> 8 is iterable >> False 9 10 [1,2,4,5,6] :<class 'list'> 11 is iterable >> True 12 13 {1,2,4,5,8,5,5,5,5} :<class 'set'> 14 is iterable >> True 15 16 (1,2,4,5,6,8) :<class 'tuple'> 17 is iterable >> True 18 19 {'a':1,'b':2} :<class 'dict'> 20 is iterable >> True 21 22 Obj() :<class '__main__.Obj'> 23 is iterable >> False 24 25 Fab(2) :<class '__main__.Fab'> 26 is iterable >> True
迭代对象的next方法
''' Created on 2018年1月5日 @author: cq ''' def main(): str1 = 'hello world!' list1 = [1,2,3,4,5,6] dicts1 = {'name' : "bob", 'age' : "18", 'city' : "Paris", 'gender' : "male" } print("迭代输出可迭代对象'字符串'的元素") list_iter = iter(str1) for i in range(len(str1)): print(list_iter.__next__()) print("----------------------") print("迭代输出可迭代对象[列表]的元素") list_iter = iter(list1) for i in range(len(list1)): print(list_iter.__next__()) print("----------------------") print("迭代输出可迭代对象{字典}的元素") list_iter = iter(dicts1.keys()) for i in range(len(dicts1)): print(list_iter.__next__()) print("----------------------") print("迭代输出可迭代对象{字典}的元素") list_iter = iter(dicts1.values()) for i in range(len(dicts1)): print(list_iter.__next__()) print("----------------------") print("迭代输出可迭代对象{字典}的元素") list_iter = iter(dicts1.items()) try: while True: print(list_iter.__next__()) except StopIteration: pass if __name__ == '__main__': main()
# 输出 迭代输出可迭代对象'字符串'的元素 h e l l o w o r l d ! ---------------------- 迭代输出可迭代对象[列表]的元素 1 2 3 4 5 6 ---------------------- 迭代输出可迭代对象{字典}的元素 name age city gender ---------------------- 迭代输出可迭代对象{字典}的元素 bob 18 Paris male ---------------------- 迭代输出可迭代对象{字典}的元素 ('name', 'bob') ('age', '18') ('city', 'Paris') ('gender', 'male')