生成器&迭代器

生成器
#只要函数中有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的文件

特点:

  1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
  2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问
  3. 访问到一半时不能往回退
  4. 便于循环比较大的数据集合,节省内存

简单的迭代器代码:

#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

 

posted @ 2017-04-24 13:41  MKY-门可意  阅读(212)  评论(0编辑  收藏  举报