zoukankan      html  css  js  c++  java
  • 生成器与列表生成式

     什么是生成器 

      我们知道的迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行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))
    

      

  • 相关阅读:
    出栈序列的可能性判定
    阿里离线数据处理平台2013暑期学校
    终于算完了这道『1+1』
    数据结构学习笔记之一 链表
    经典解释监视器和对象锁
    Sybase中字符串替换函数 STR REPLACE
    使用Arrays sort 方法進行排序
    clustered和nonclustered索引的区别
    Java序列化的作用和反序列化
    Java多线程下载并具断点续传功能JAR
  • 原文地址:https://www.cnblogs.com/buchiyudeyang/p/9505538.html
Copyright © 2011-2022 走看看