• 生成器&迭代器


    生成器
    #只要函数中有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
  • 相关阅读:
    转载:Package by feature, not layer
    [翻译][架构设计]The Clean Architecture
    消息处理管道
    Pool:小对象缓存or复用
    View事件分发
    动静分离-前后端分离部署
    MySQL 执行计划中Extra的浅薄理解
    探索java世界中的日志奥秘
    记一次转不过弯的递归
    Spring MVC
  • 原文地址:https://www.cnblogs.com/menkeyi/p/6756482.html
Copyright © 2020-2023  润新知