zoukankan      html  css  js  c++  java
  • 2017.8.2迭代器和生成器

    迭代器部分

    可迭代协议

    可以被迭代,切满足一定发要求,就是内部实现了'_itsr_'的方法。

    迭代器:

    迭代器遵循可迭代协议,并且同时实现了'_iter_'和'_next_'的方法。

    for循环本质:

    for循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法,即在遍历之前,先调用对象的__iter__方法将其转换成一个迭代器,然后使用迭代器协议去实现循环访问,这样所有的对象就都可以通过for循环来遍历了

    生成器部分

    python中提供的生成器:

    生成器:由常规函数定义,yield返回,且每执行一次就返回一次结果,并将函数至于挂起状态,以备再次调用!

    生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

    生成器Generator:

    1.本质是一个迭代器(自带_iter_和_next_方法,不需要再去实现)

    2.惰性计算,需要开发者编写

    列表推导式和生成器表达式

    #老男孩由于峰哥的强势加盟很快走上了上市之路,alex思来想去决定下几个鸡蛋来报答峰哥
    
    egg_list=['鸡蛋%s' %i for i in range(10)] #列表解析
    
    #峰哥瞅着alex下的一筐鸡蛋,捂住了鼻子,说了句:哥,你还是给我只母鸡吧,我自己回家下
    
    laomuji=('鸡蛋%s' %i for i in range(10))#生成器表达式
    print(laomuji)
    print(next(laomuji)) #next本质就是调用__next__
    print(laomuji.__next__())
    print(next(laomuji))

    ==》》
    #列表解析
    sum([i for i in range(100000000)])#内存占用大,机器容易卡死
    #生成器表达式
    sum(i for i in range(100000000))#几乎不占内存
    生成器使用的优点:
    1.节省内存,延迟计算,一次只执行一个结果,因此处理大型数据会有优势
    2.提高代码的可读性
  • 相关阅读:
    JSP自定义标签_用简单标签控制标签体执行10次
    JSP自定义标签_用简单标签实现控制标签体是否执行
    eclipse 使用lombok 精简java bean
    转 :关于springmvc使用拦截器
    转: spring静态注入
    spring 4.0+quartz2.2 实现持久化
    排除maven jar冲突 maven tomcat插件启动报错 filter转换异常
    转 Quartz将Job持久化所需表的说明
    转 maven jetty 插件
    ORA-14300: 分区关键字映射到超出允许的最大分区数的分区
  • 原文地址:https://www.cnblogs.com/Leon27-29/p/7274840.html
Copyright © 2011-2022 走看看