迭代器
1 #!/usr/bin/env python 2 # -*- coding=utf-8 -*- 3 4 """ 5 可以直接作用于for循环的对象成为可迭代对象 iterable 6 1、集合数据类型 7 list、tuple、dict、set、str 8 2、generator 9 包括生成器和带yield的generator 10 """ 11 12 #可以使用isinstance()判断对象是否是 Iterable对象 13 from collections import Iterable 14 15 isinstance([],Iterable) #True 16 17 isinstance({},Iterable) #True 18 19 isinstance('abc',Iterable) #True 20 21 isinstance((x for x in range(10)),Iterable) #True 22 23 isinstance(100,Iterable) #False 24 25 #可以被next()函数调用并不断返回下一个值得对象称为迭代器 Iterator 26 #可以使用isinstance()判断对象是否是 Iterator对象 27 isinstance(100,Iterator) #False 28 29 isinstance('abc',Iterator) #False 30 31 isinstance([],Iterator) #False 32 33 isinstance((),Iterator) #False 34 35 isinstance((x for x in range(10)),Iterator) #True 36 37 ''' 38 1、生成器都是Iterator对象 39 2、但list、dict、str虽然是Iterable,却不是Iterator 40 原因:因为Python的Iterator对象表示的是一个数据流, 41 可以把这个数据流看做是一个有序序列, 42 但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据 43 所以Iterator得计算是惰性的,只有在需要返回下一个数据的时候他才会计算 44 ''' 45 46 #把list、dict、str等Iterable变成Iterator可以使用iter()函数 47 isinstance([],Iterator) #False 48 49 isinstance(iter([]),Iterator) #True 50 51 """ 52 总结: 53 1、凡是可作用于for循环的对象都是Iterable对象 54 2、凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列 55 3、但list、dict、str虽然是Iterable,却不是Iterator,可以使用iter()函数变成Iterator 56 """ 57 58 #for循环本质就是通过不断调用next()函数实现的: 59 #例如: 60 for x in range(1,10): 61 pass 62 63 #等价于: 64 65 #首先获得Iterator对象: 66 it=iter(range(1,10)) 67 while True: 68 try: 69 #获得下一个值 70 x=next(it) 71 #遇到StopIteration就退出循环 72 except StopIteration: 73 break