zoukankan      html  css  js  c++  java
  • python基础-第六篇-6.1生成器与迭代器

    迭代器

    特点:

    1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容

    2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问

    3. 访问到一半时不能往回退

    4. 便于循环比较大的数据集合,节省内存

    names = iter(['alex','wupeiqi','eva'])
    print(names)
    print(names.__next__())
    print(names.__next__())
    print(names.__next__())
    #在往下取就报错
    # print(names.__next__())
    

    生成器

      一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器 

    #ATM
    def cash_money(amount):
        while amount > 0:
            amount -= 100
            yield 100
            print('又来取钱啦!')
    
    #这里没有真正执行函数,只是把函数变成一个迭代器
    atm = cash_money(500)
    # print(atm)
    print(atm.__next__())
    print(atm.__next__())
    print('叫个大保健')
    print(atm.__next__())
    

    yield单线程异步并发

    #消费者生产者模型
    
    import time
    def consumer(name1):
        print('{name}准备吃包子啦!'.format(name = name1))
        while True:
            baozi = yield
            print('第{baozi_num}个包子来了,被{name}吃了!'.format(baozi_num=baozi,name=name1))
    
    def producer(name2):
        c = consumer('a')
        c2 = consumer('b')
        c.__next__()
        c2.__next__()
        print('{name}开始准备做包子啦!'.format(name=name2))
        for i in range(1,6):
            time.sleep(1)
            print('做了两个包子!')
            c.send(i)
            c2.send(i)
    
    producer('alex')
    

    生成器表达式

      列表解析和生成器表达式非常的相似,不过有一点明显的区别:列表解析是用中括号括起来,而生成器表达式则是小括号

    #列表解析
    li = [i+100 for i in range(10)]
    print(li)
    
    #加条件
    li2 = [i+100 for i in range(10) if i % 2 == 0]
    print(li2)
    

       由于列表解析非常占内存,所以不适用大数据的场景

    #生成器表达式
    li = (i+100 for i in range(10))
    print(li)
    #<generator object <genexpr> at 0x0000000000A2AE08>
    
    #加条件
    li2 = (i+100 for i in range(10) if i % 2 == 0)
    for x in li2:
        print(x)
    

                                                   欢迎大家对我的博客内容提出质疑和提问!谢谢

                                                                                 笔者:拍省先生  

     

  • 相关阅读:
    SpringMVC中静态获取request对象 Spring中获取 HttpServletRequest对象【转载】
    springcloud 的loadbalancer 轮询算法切换方法 2021.4.3
    springboot项目启动增加图标
    rabbitmq 端口作用以及修改方法
    centos8 安装rabbitmq
    springcloud config client Value获取不到信息的问题的处理方法
    springcloud config配置git作为数据源然后启动报错 If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    Sublime Text的列模式如何操作
    centos8 安装redis
    jQuery简单的Ajax调用
  • 原文地址:https://www.cnblogs.com/xinsiwei18/p/5616058.html
Copyright © 2011-2022 走看看