• 生成器与列表生成式


     什么是生成器 

      我们知道的迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,迭代器有的好处是可以节省呢内存。如果在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫做生成器。

    python中提供的生成器:

    1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行。

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

    用以下两种方式构建一个生成器:

    1. 通过生成器函数写

    2. 生成器表达式

    #生成器函数:
    def func1(x):
    	x+=1
    	yield x
    g=func1(5)#生成器对象
    g.__next__()#一个next对应一个yield,到yield停止
    #yield将值返回给.__next__()
    

      

    yield与return的区别

    • return结束函数,给函数的执行者返回值

    • yeild不会结束函数 ,一个next对应一个yield

    生成器和迭代器的区别

    1. 内存级别的区别

      • 迭代器是需要可迭代对象进行转化。可迭代对象非常占内存

      • 生成器直接创建,不需要转化。从本质就节省内存

    send 与next

    def func1():
    	print(1)
    	count = yield 6
        print (count)
    	print(2)
    	yield 7
    	print(3)
    	yield 8
    g = func1()
    print(next(g))
    print(g.send('alex'))
    print(next(g))
    #send 与 next一样,也是对生成器取值(执行一个yield)的方法。
    #send 可以给上一个yield传一个值
    #send的坑:1.第一个值永远是next 2.最后一个yield永远得不到send传的值
    

      

    列表推到式,生成器表达式

    一行代码几乎搞定你需要的任何的列表

    • 循环模式[变量(加工后的变量)for 变量 in iterable]

    l = [i for i in range(1,101)]
    print(l)
    

      筛选模式

    l3 =[i for i in range(1,31)ifi%==0]
    

      

    • 列表推到式

      优点:一行解决,方便

      缺点:容易着迷,只能构建相对的列表 ,不易排错 不能超过三次循环,

    生成器表达式:将列表表达式【】换成()

    g = (i for i in range(100))
    print(g)
    print(next(g))
    

      

  • 相关阅读:
    Win10 Theano Install Guide
    mysql 查看版本和是否支持分区
    [mysql]Date和String相互转换(DATE_FORMAT&STR_TO_DATE)
    mysql运用now(3)存储时间到毫秒
    mysql按天,按周,按月,按季度,按年统计数据
    对象的copy
    定时调度任务quartz
    mysql使用navicat编写调用存储过程
    mysql批量插入,批量更新
    Mybatis分页插件pagehelper的使用
  • 原文地址:https://www.cnblogs.com/buchiyudeyang/p/9505538.html
Copyright © 2020-2023  润新知