生成器
#只要函数中有yield那么这个函数就编程了生成器函数
def x():
print(1)
a=2
#yield保存了函数的执行状态
yield 1
#这里打印上次yield的变量值
print(a)
yield 2
print(3)
yield 3
a=x()
a.next()
a.next()
a.next()
#a.next()超过了yield的数量就会报错
while 循环结合生成器,用生成器的好处在于不需要一次性加载所有内容,用的时候加载就行
def x(n): start=0 while True: if start >= n : return yield start start+=1 a=x(3) a1=a.next() a2=a.next() a3=a.next() print(a1,a2,a3) 结果: (0, 1, 2)
迭代器
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件
特点:
- 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
- 不能随机访问集合中的某个值 ,只能从头到尾依次访问
- 访问到一半时不能往回退
- 便于循环比较大的数据集合,节省内存
简单的迭代器代码:
#iter迭代器,实际上迭代器就是用for来循环输出一下 for i in iter([0,1,2,3]): print(i)
如何判断是否是可迭代对象?
迭代对象一定包含"__iter__"方法, print("__iter__" in xxx对象) 即可
如何判断是否是迭代器?
对象方法中含有"__iter__" 和"__next__"方法
迭代对象和迭代器的区别?
迭代对象是无法一个一个取值的,迭代器可以用__next__方法 一个一个取值
迭代对象处理数据比较灵活可以随便调用,迭代器只能向后取数据,无法向前取数据 .下面是迭代器的例子
1 l1 = [1,2,3,4,5] 2 obj = iter(l1) 3 4 for i in range(2): 5 print(next(obj)) 6 7 8 for i in range(2): 9 print(next(obj)) 10 11 输出: 12 1 13 2 14 3 15 4
迭代器可以节省内存,因为是一次取一点,迭代对象则是全部加载到内存.迭代器速度比较慢,以时间换空间
可迭代对象转化成迭代器
a = "abnmasdui" 转换方法1 obj = iter(a) 转换方法2 obj.__iter__()
生成器和迭代器结合使用。以后以生成器为主。迭代实际上就是for循环来用
1 def x(n): 2 start=0 3 while True: 4 if start >= n : 5 return 6 yield start 7 start+=1 8 9 10 #迭代上面的生成器代码 11 for i in x(5): 12 print i